/ Hex Artifact Content
Login

Artifact da57d6cdd925392aa5e8ed99908e037d562a238c8153e458b9a4b1a13021bfdb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when 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 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
7ed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
7ee0: 55 52 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20  URRENT.  Bitvec 
7ef0: 2a 70 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20  *pAllRead;      
7f00: 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65       /* Pages re
7f10: 61 64 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e  ad within curren
7f20: 74 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  t CONCURRENT tra
7f30: 6e 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ns. */.#endif.  
7f40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7f50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7f60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f70: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7f80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7f90: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7fa0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7fb0: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7fd0: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7fe0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7ff0: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
8000: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
8010: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
8020: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
8030: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
8040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8050: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
8060: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
8070: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
8080: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
8090: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
80a0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
80b0: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
80c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
80d0: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
80e0: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
80f0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
8100: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
8110: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
8120: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
8130: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8150: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
8160: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
8170: 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74  [] */.  u32 iDat
8180: 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20  aVersion;       
8190: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
81a0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
81b0: 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73   content changes
81c0: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
81d0: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
81e0: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
81f0: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
8200: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a  ile changes */..
8210: 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20    int nMmapOut; 
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8230: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20   Number of mmap 
8240: 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
8250: 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20  outstanding */. 
8260: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
8270: 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  zMmap;       /* 
8280: 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20  Desired maximum 
8290: 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50  mmap size */.  P
82a0: 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c  gHdr *pMmapFreel
82b0: 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist;       /* Li
82c0: 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20  st of free mmap 
82d0: 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44  page headers (pD
82e0: 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20  irty) */.  /*.  
82f0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f  ** End of the ro
8300: 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67  utinely-changing
8310: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20   class members. 
8320: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
8330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20  ************/.. 
8370: 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20   u16 nExtra;    
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8390: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
83a0: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
83b0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
83c0: 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20  i16 nReserve;   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
83e0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
83f0: 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20  bytes at end of 
8400: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
8410: 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20  32 vfsFlags;    
8420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
8430: 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
8440: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
8450: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8470: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
8480: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
8490: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  ack */.  int pag
84a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
84b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
84c0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
84d0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
84e0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
84f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
8500: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
8510: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
8520: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
8530: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
8540: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
8550: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
8560: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72   files */.  char
8570: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
8580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
85a0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
85b0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
85c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
85d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
85e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  e */.  int (*xBu
85f0: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
8600: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
8610: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
8620: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
8630: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
8640: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
8650: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
8660: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20  andler */.  int 
8670: 61 53 74 61 74 5b 34 5d 3b 20 20 20 20 20 20 20  aStat[4];       
8680: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8690: 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   cache hits, mis
86a0: 73 65 73 2c 20 77 72 69 74 65 73 2c 20 73 70 69  ses, writes, spi
86b0: 6c 6c 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  lls */.#ifdef SQ
86c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
86d0: 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
86e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
86f0: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a  ase pages read *
8700: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
8710: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
8720: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
8730: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
8740: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
8750: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 47 65 74   */.  int (*xGet
8760: 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62  )(Pager*,Pgno,Db
8770: 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20 2f 2a 20  Page**,int); /* 
8780: 52 6f 75 74 69 6e 65 20 74 6f 20 66 65 74 63 68  Routine to fetch
8790: 20 61 20 70 61 74 63 68 20 2a 2f 0a 23 69 66 64   a patch */.#ifd
87a0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
87b0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
87c0: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
87d0: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
87e0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
87f0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8800: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8810: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8820: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8830: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8840: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8850: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
8860: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
8870: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
8880: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
8890: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
88a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
88b0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
88c0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
88d0: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
88e0: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
88f0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8900: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8910: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8920: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8930: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8950: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
8960: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
8970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8980: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
8990: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
89a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
89b0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
89c0: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
89d0: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
89e0: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
89f0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8a00: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8a10: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8a20: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8a30: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8a40: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8a50: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
8a60: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
8a70: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
8a80: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
8a90: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
8aa0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
8ab0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8ac0: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8ad0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8ae0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8af0: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8b00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8b10: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8b20: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8b30: 52 49 54 45 20 32 0a 23 64 65 66 69 6e 65 20 50  RITE 2.#define P
8b40: 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c 20  AGER_STAT_SPILL 
8b50: 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  3../*.** The fol
8b60: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8b70: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8b80: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8b90: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8ba0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8bb0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8bc0: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8bd0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8be0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8bf0: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
8c00: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
8c10: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
8c20: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8c30: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
8c40: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8c50: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8c60: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8c70: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8c80: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8c90: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8ca0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8cb0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8cc0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8cd0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8ce0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8cf0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8d00: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
8d10: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8d20: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
8d30: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8d40: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
8d50: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8d60: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8d70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8d80: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8d90: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8da0: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8db0: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8dc0: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8dd0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8de0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8df0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8e00: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8e10: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8e20: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8e30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8e40: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8e50: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8e60: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8e70: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8e80: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8e90: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8ea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8eb0: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8ec0: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8ed0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8ee0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8ef0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8f00: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8f10: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8f20: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8f30: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8f40: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8f50: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8f60: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8f70: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8f80: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8f90: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8fa0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8fb0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8fc0: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8fd0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8fe0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8ff0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
9000: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
9010: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
9020: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
9030: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
9040: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
9050: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
9060: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
9070: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
9080: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
9090: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
90a0: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
90b0: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
90c0: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
90d0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
90e0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
90f0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
9100: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
9110: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
9120: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
9130: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
9140: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
9150: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
9160: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
9170: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
9180: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
9190: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
91a0: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
91b0: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
91c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
91d0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
91e0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
91f0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
9200: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
9210: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
9220: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
9230: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
9240: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
9250: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
9260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9270: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9280: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
9290: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
92a0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
92b0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
92c0: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
92d0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
92e0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
92f0: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
9300: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
9310: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
9320: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
9330: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
9340: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
9350: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9360: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9370: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9380: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9390: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
93a0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
93b0: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
93c0: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
93d0: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
93e0: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
93f0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9400: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
9410: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
9420: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
9430: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
9440: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9450: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9460: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9470: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9480: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9490: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
94a0: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
94b0: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
94c0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
94d0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
94e0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
94f0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
9500: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
9510: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
9520: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
9530: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9540: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
9550: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9560: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9570: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9580: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9590: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
95a0: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
95b0: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
95c0: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
95d0: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
95e0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
95f0: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
9600: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
9610: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9620: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
9630: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
9640: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
9650: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9660: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9670: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9680: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9690: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
96a0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
96b0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
96c0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
96d0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
96e0: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
96f0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
9700: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
9710: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
9720: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
9730: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
9740: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
9750: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9760: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9770: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9780: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9790: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
97a0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
97b0: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
97c0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
97d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
97e0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
97f0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
9800: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
9810: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
9820: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
9830: 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
9840: 41 44 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  AD./*.** Return 
9850: 74 72 75 65 20 69 66 20 70 61 67 65 20 70 67 6e  true if page pgn
9860: 6f 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  o can be read di
9870: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
9880: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
9890: 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
98a0: 61 79 65 72 2e 20 54 68 69 73 20 69 73 20 74 68  ayer. This is th
98b0: 65 20 63 61 73 65 20 69 66 3a 0a 2a 2a 0a 2a 2a  e case if:.**.**
98c0: 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
98d0: 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 0a  e file is open,.
98e0: 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
98f0: 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20   no dirty pages 
9900: 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
9910: 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 65 73  d.**   * the des
9920: 69 72 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  ired page is not
9930: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
9940: 65 20 77 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 69  e wal file..*/.i
9950: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  nt sqlite3PagerD
9960: 69 72 65 63 74 52 65 61 64 4f 6b 28 50 61 67 65  irectReadOk(Page
9970: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
9980: 70 67 6e 6f 29 7b 0a 20 20 69 66 28 20 70 50 61  pgno){.  if( pPa
9990: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
99a0: 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
99b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 43  .  if( sqlite3PC
99c0: 61 63 68 65 49 73 44 69 72 74 79 28 70 50 61 67  acheIsDirty(pPag
99d0: 65 72 2d 3e 70 50 43 61 63 68 65 29 20 29 20 72  er->pPCache) ) r
99e0: 65 74 75 72 6e 20 30 3b 0a 23 69 66 64 65 66 20  eturn 0;.#ifdef 
99f0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
9a00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
9a10: 43 6f 64 65 63 21 3d 30 20 29 20 72 65 74 75 72  Codec!=0 ) retur
9a20: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  n 0;.#endif.#ifn
9a30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9a40: 57 41 4c 0a 20 20 69 66 28 20 70 50 61 67 65 72  WAL.  if( pPager
9a50: 2d 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 75 33  ->pWal ){.    u3
9a60: 32 20 69 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  2 iRead = 0;.   
9a70: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
9a80: 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
9a90: 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
9aa0: 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 52 65 61 64  al, pgno, &iRead
9ab0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 72  );.    return (r
9ac0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9ad0: 69 52 65 61 64 3d 3d 30 29 3b 0a 20 20 7d 0a 23  iRead==0);.  }.#
9ae0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31  endif.  return 1
9af0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
9b00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9b10: 57 41 4c 0a 23 20 64 65 66 69 6e 65 20 70 61 67  WAL.# define pag
9b20: 65 72 55 73 65 57 61 6c 28 78 29 20 28 28 78 29  erUseWal(x) ((x)
9b30: 2d 3e 70 57 61 6c 21 3d 30 29 0a 23 65 6c 73 65  ->pWal!=0).#else
9b40: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
9b50: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
9b60: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9b70: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9b80: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9b90: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9ba0: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9bb0: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9bc0: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9bd0: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9be0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9bf0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9c00: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
9c10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
9c20: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
9c30: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
9c40: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
9c50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9c60: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9c70: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9c80: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9c90: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9ca0: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9cb0: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9cc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9cd0: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9ce0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9cf0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9d00: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
9d10: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
9d20: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
9d30: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
9d40: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9d50: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
9d60: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9d70: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9d80: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9d90: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9da0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9db0: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9dc0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9dd0: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9de0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9df0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9e00: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9e10: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9e20: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9e30: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9e40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9e50: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9e60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9e70: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9e80: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9e90: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9ea0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9eb0: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9ec0: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9ed0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9ee0: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9ef0: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9f00: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9f10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9f20: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9f30: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9f40: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9f50: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9f60: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9f70: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9f80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9f90: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9fa0: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9fb0: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9fc0: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9fd0: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9fe0: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9ff0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
a000: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
a010: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
a020: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
a030: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a040: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
a050: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
a060: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
a070: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
a080: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
a090: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
a0a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
a0b0: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
a0c0: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
a0d0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
a0e0: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
a0f0: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
a100: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
a110: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
a120: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
a130: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
a140: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
a150: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
a160: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
a170: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
a180: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
a190: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
a1a0: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
a1b0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
a1c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
a1d0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
a1e0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
a1f0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
a200: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
a210: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
a220: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
a230: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
a240: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
a250: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
a260: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
a270: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
a280: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
a290: 72 74 28 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66  rt( !isOpen(p->f
a2a0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
a2b0: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
a2c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
a2d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a2e0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a2f0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
a300: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a310: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a320: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
a330: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
a340: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
a350: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
a360: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
a370: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
a380: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
a390: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
a3a0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
a3b0: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
a3c0: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
a3d0: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
a3e0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
a3f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
a400: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
a410: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
a420: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
a430: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
a440: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
a450: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
a460: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
a470: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
a480: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
a490: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
a4a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a4b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4c0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a4e0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
a4f0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
a500: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
a510: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
a520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a530: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
a540: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
a550: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a560: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a570: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a580: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
a590: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a5a0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a5b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
a5c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a5d0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a5e0: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
a5f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a600: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a610: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a620: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a630: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a640: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
a650: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
a660: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a670: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a680: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a690: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a6a0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
a6b0: 4e 54 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  NT.      assert(
a6c0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
a6d0: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
a6e0: 69 7a 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  ize || pPager->p
a6f0: 41 6c 6c 52 65 61 64 20 29 3b 0a 23 65 6e 64 69  AllRead );.#endi
a700: 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  f.      assert( 
a710: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a720: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a730: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a740: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a750: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a760: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a770: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a780: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a790: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a7a0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a7b0: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a7c0: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a7d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a7e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a7f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a800: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a810: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a820: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a830: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a840: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a850: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a860: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a870: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a880: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a890: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a8a0: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a8b0: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a8c0: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a8d0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a8e0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a8f0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a900: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a910: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a920: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a930: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a940: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a950: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a960: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a970: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a980: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a990: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a9a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a9b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a9d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a9e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a9f0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
aa00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
aa10: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
aa20: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
aa30: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
aa40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aa50: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
aa60: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
aa70: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
aa80: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
aa90: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
aaa0: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
aab0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
aac0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
aad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
aae0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
aaf0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
ab00: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
ab10: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
ab20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ab30: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
ab40: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
ab50: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
ab60: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
ab70: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
ab80: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ab90: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
aba0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
abb0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
abc0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
abd0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
abe0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
abf0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ac00: 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  p->fd)&SQLITE_IO
ac10: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
ac20: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
ac30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ac40: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
ac50: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
ac60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ac70: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
ac80: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
ac90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aca0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
acb0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
acc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
acd0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
ace0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
acf0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
ad00: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
ad10: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
ad20: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
ad30: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
ad40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ad50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
ad60: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
ad70: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
ad80: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ad90: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20  WAL .           
ada0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
adb0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
adc0: 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45  cs(p->fd)&SQLITE
add0: 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f  _IOCAP_BATCH_ATO
ade0: 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  MIC).      );.  
adf0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
ae00: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
ae10: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
ae20: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
ae30: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
ae40: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
ae50: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
ae60: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
ae70: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
ae80: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
ae90: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
aea0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
aeb0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
aec0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
aed0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
aee0: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
aef0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
af00: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
af10: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
af20: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c  r->pPCache)>0 ||
af30: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
af40: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
af50: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
af60: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  1;.}.#endif /* i
af70: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a  fndef NDEBUG */.
af80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
af90: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75  EBUG ./*.** Retu
afa0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
afb0: 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
afc0: 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61   string in a sta
afd0: 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f  tic buffer.** co
afe0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61  ntaining the sta
aff0: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
b000: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
b010: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68   an argument. Th
b020: 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65  is.** is intende
b030: 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  d to be used wit
b040: 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46  hin debuggers. F
b050: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61  or example, as a
b060: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  n alternative.**
b070: 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67   to "print *pPag
b080: 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a  er" in gdb:.**.*
b090: 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22  * (gdb) printf "
b0a0: 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72  %s", print_pager
b0b0: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a  _state(pPager).*
b0c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b0d0: 65 20 68 61 73 20 65 78 74 65 72 6e 61 6c 20 6c  e has external l
b0e0: 69 6e 6b 61 67 65 20 69 6e 20 6f 72 64 65 72 20  inkage in order 
b0f0: 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d 70  to suppress comp
b100: 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a 2a 2a  iler warnings.**
b110: 20 61 62 6f 75 74 20 61 6e 20 75 6e 75 73 65 64   about an unused
b120: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 69   function.  It i
b130: 73 20 65 6e 63 6c 6f 73 65 64 20 77 69 74 68 69  s enclosed withi
b140: 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  n SQLITE_DEBUG a
b150: 6e 64 20 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e 6f  nd so does.** no
b160: 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
b170: 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63 68  al builds..*/.ch
b180: 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f  ar *print_pager_
b190: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
b1a0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
b1b0: 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71  Ret[1024];..  sq
b1c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
b1d0: 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20  024, zRet,.     
b1e0: 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20   "Filename:     
b1f0: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74   %s\n".      "St
b200: 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20  ate:         %s 
b210: 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20  errCode=%d\n".  
b220: 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20      "Lock:      
b230: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
b240: 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20  "Locking mode:  
b250: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c  locking_mode=%s\
b260: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
b270: 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c  l mode:  journal
b280: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
b290: 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65    "Backing store
b2a0: 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65  : tempFile=%d me
b2b0: 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61  mDb=%d useJourna
b2c0: 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a  l=%d\n".      "J
b2d0: 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f  ournal:       jo
b2e0: 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f  urnalOff=%lld jo
b2f0: 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22  urnalHdr=%lld\n"
b300: 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20  .      "Size:   
b310: 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64         dbsize=%d
b320: 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64   dbOrigSize=%d d
b330: 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a  bFileSize=%d\n".
b340: 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65        , p->zFile
b350: 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  name.      , p->
b360: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
b370: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20  EN            ? 
b380: 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20  "OPEN" :.       
b390: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b3a0: 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20  R_READER        
b3b0: 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20    ? "READER" :. 
b3c0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
b3d0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
b3e0: 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45  OCKED   ? "WRITE
b3f0: 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20  R_LOCKED" :.    
b400: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b410: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
b420: 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43  EMOD ? "WRITER_C
b430: 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20  ACHEMOD" :.     
b440: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b450: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
b460: 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42      ? "WRITER_DB
b470: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b480: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b490: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
b4a0: 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ? "WRITER_FINISH
b4b0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
b4c0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
b4d0: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f  RROR           ?
b4e0: 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72   "ERROR" : "?err
b4f0: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
b500: 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  t)p->errCode.   
b510: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
b520: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
b530: 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20   "NO_LOCK" :.   
b540: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52       p->eLock==R
b550: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f  ESERVED_LOCK   ?
b560: 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20   "RESERVED" :.  
b570: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b580: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
b590: 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a  ? "EXCLUSIVE" :.
b5a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
b5b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  ==SHARED_LOCK   
b5c0: 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20    ? "SHARED" :. 
b5d0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b5e0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20  =UNKNOWN_LOCK   
b5f0: 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22   ? "UNKNOWN" : "
b600: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
b610: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
b620: 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20  e ? "exclusive" 
b630: 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20  : "normal".     
b640: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64   , p->journalMod
b650: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b660: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20  MODE_MEMORY   ? 
b670: 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20  "memory" :.     
b680: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b690: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b6a0: 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20  MODE_OFF      ? 
b6b0: 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20  "off" :.        
b6c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b6d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b6e0: 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65  E_DELETE   ? "de
b6f0: 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  lete" :.        
b700: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b710: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b720: 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65  E_PERSIST  ? "pe
b730: 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20  rsist" :.       
b740: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b750: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b760: 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74  DE_TRUNCATE ? "t
b770: 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20  runcate" :.     
b780: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b790: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b7a0: 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20  MODE_WAL      ? 
b7b0: 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f  "wal" : "?error?
b7c0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b7d0: 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74  ->tempFile, (int
b7e0: 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29  )p->memDb, (int)
b7f0: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  p->useJournal.  
b800: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
b810: 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48  Off, p->journalH
b820: 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  dr.      , (int)
b830: 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29  p->dbSize, (int)
b840: 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28  p->dbOrigSize, (
b850: 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a  int)p->dbFileSiz
b860: 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e.  );..  return
b870: 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
b880: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
b890: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76 61  rences to the va
b8a0: 72 69 6f 75 73 20 70 61 67 65 20 67 65 74 74 65  rious page gette
b8b0: 72 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  rs */.static int
b8c0: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50   getPageNormal(P
b8d0: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b8e0: 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63  e**,int);.static
b8f0: 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f   int getPageErro
b900: 72 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62  r(Pager*,Pgno,Db
b910: 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66  Page**,int);.#if
b920: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b930: 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
b940: 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 50  nt getPageMMap(P
b950: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b960: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66  e**,int);.#endif
b970: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b980: 50 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68 6f  Pager.xGet metho
b990: 64 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f 70  d for the approp
b9a0: 72 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75 73  riate routine us
b9b0: 65 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63  ed to fetch.** c
b9c0: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
b9d0: 70 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pager..*/.static
b9e0: 20 76 6f 69 64 20 73 65 74 47 65 74 74 65 72 4d   void setGetterM
b9f0: 65 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50 61  ethod(Pager *pPa
ba00: 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
ba10: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
ba20: 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20     pPager->xGet 
ba30: 3d 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b 0a  = getPageError;.
ba40: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
ba50: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c  MAP_SIZE>0.  }el
ba60: 73 65 20 69 66 28 20 55 53 45 46 45 54 43 48 28  se if( USEFETCH(
ba70: 70 50 61 67 65 72 29 0a 23 69 66 64 65 66 20 53  pPager).#ifdef S
ba80: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
ba90: 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43     && pPager->xC
baa0: 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20  odec==0.#endif. 
bab0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
bac0: 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d 4d  xGet = getPageMM
bad0: 61 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ap;.#endif /* SQ
bae0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
baf0: 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  ZE>0 */.  }else{
bb00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
bb10: 74 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d 61  t = getPageNorma
bb20: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
bb30: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
bb40: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
bb50: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
bb60: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
bb70: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
bb80: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
bb90: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
bba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
bbb0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
bbc0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
bbd0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
bbe0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
bbf0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
bc00: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
bc10: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
bc20: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
bc30: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
bc40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
bc50: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
bc60: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
bc70: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
bc80: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
bc90: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
bca0: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
bcb0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
bcc0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
bcd0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
bce0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
bcf0: 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  *p;.  Pgno pgno 
bd00: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69  = pPg->pgno;.  i
bd10: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
bd20: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
bd30: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
bd40: 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53   p = &pPager->aS
bd50: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
bd60: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
bd70: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
bd80: 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75  3BitvecTestNotNu
bd90: 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  ll(p->pInSavepoi
bda0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
bdb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
bdc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bdd0: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
bde0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
bdf0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
be00: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
be10: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
be20: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
be30: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
be40: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
be50: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
be60: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
be70: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
be80: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
be90: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e  Pg->pgno);.}.#en
bea0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
beb0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
bec0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
bed0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
bee0: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
bef0: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
bf00: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
bf10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
bf20: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
bf30: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
bf40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
bf50: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
bf60: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
bf70: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
bf80: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
bf90: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
bfa0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
bfb0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
bfc0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
bfd0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
bfe0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
bff0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
c000: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
c010: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
c020: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
c030: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c040: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
c050: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
c060: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c070: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
c080: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
c090: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
c0a0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
c0b0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
c0c0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
c0d0: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
c0e0: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
c0f0: 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  B).../*.** Write
c100: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
c110: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
c120: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c130: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
c140: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
c150: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
c160: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
c170: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
c180: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
c190: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
c1a0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
c1b0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
c1c0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
c1d0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
c1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
c1f0: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
c200: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
c210: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
c220: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c230: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c240: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c250: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20  ther NO_LOCK.** 
c260: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20  or SHARED_LOCK. 
c270: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
c280: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
c290: 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b   call to xUnlock
c2a0: 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20  ().** succeeds, 
c2b0: 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c  set the Pager.eL
c2c0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
c2d0: 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d  match the (attem
c2e0: 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a  pted) new lock..
c2f0: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
c300: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
c310: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
c320: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
c330: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
c340: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
c350: 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63  fy it. See the c
c360: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
c370: 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20   #define of .** 
c380: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
c390: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
c3a0: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
c3b0: 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f  ic int pagerUnlo
c3c0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c3d0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c3e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c3f0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c400: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c410: 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
c420: 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20  r->eLock==eLock 
c430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
c440: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck==NO_LOCK || e
c450: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c460: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
c470: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
c480: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
c490: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ger)==0 );.  if(
c4a0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c4b0: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
c4c0: 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
c4d0: 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72  >=eLock );.    r
c4e0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
c4f0: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
c500: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
c510: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c520: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ck);.    if( pPa
c530: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
c540: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
c550: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c560: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c570: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
c580: 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  "UNLOCK %p %d\n"
c590: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
c5a0: 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ).  }.  return r
c5b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
c5c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c5d0: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
c5e0: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
c5f0: 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c   either SHARED_L
c600: 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44  OCK,.** RESERVED
c610: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
c620: 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20  VE_LOCK. If the 
c630: 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73  caller is succes
c640: 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a  sful, set the.**
c650: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
c660: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77  iable to the new
c670: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20   locking state. 
c680: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
c690: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
c6a0: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
c6b0: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
c6c0: 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63  unction is .** c
c6d0: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
c6e0: 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74  dify it unless t
c6f0: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
c700: 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56  tate is EXCLUSIV
c710: 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20  E_LOCK. .** See 
c720: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
c730: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
c740: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
c750: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
c760: 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f   .** of this..*/
c770: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c780: 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  rLockDb(Pager *p
c790: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
c7a0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c7b0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
c7c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  rt( eLock==SHARE
c7d0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
c7e0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
c7f0: 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  | eLock==EXCLUSI
c800: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
c810: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65   pPager->eLock<e
c820: 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Lock || pPager->
c830: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
c840: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
c850: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c860: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c870: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
c880: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
c890: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c8a0: 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d  E_OK && (pPager-
c8b0: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c8c0: 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43  LOCK||eLock==EXC
c8d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a  LUSIVE_LOCK) ){.
c8e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
c8f0: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
c900: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
c910: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
c920: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
c930: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c940: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c950: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
c960: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
c970: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
c980: 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61  ic-write or.** a
c990: 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74  tomic-batch-writ
c9a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
c9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
c9c0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
c9d0: 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  .** atomic-write
c9e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
c9f0: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
ca00: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
ca10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
ca20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
ca30: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
ca40: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
ca50: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
ca60: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
ca70: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
ca80: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
ca90: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
caa0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
cab0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
cac0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
cad0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
cae0: 2a 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  * If it can be u
caf0: 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  sed, then the va
cb00: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
cb10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
cb20: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
cb30: 20 77 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   when it contain
cb40: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
cb50: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
cb60: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
cb70: 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69  atomic-batch-wri
cb80: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
cb90: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 4f  can be used if O
cba0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
cbb0: 69 73 74 69 63 73 28 29 0a 2a 2a 20 72 65 74 75  istics().** retu
cbc0: 72 6e 73 20 61 20 76 61 6c 75 65 20 77 69 74 68  rns a value with
cbd0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
cbe0: 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20 62  P_BATCH_ATOMIC b
cbf0: 69 74 20 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a  it set. -1 is.**
cc00: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
cc10: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
cc20: 20 6e 65 69 74 68 65 72 20 6f 70 74 69 6d 69 7a   neither optimiz
cc30: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
cc40: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
cc50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc60: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
cc70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
cc80: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
cc90: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
cca0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
ccb0: 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c  OMIC_WRITE) \. |
ccc0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
ccd0: 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
cce0: 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 69 6e  OMIC_WRITE).  in
ccf0: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
cd20: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20  teristics */..  
cd30: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
cd40: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
cd50: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
cd60: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
cd70: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
cd80: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
cd90: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 72  PARAMETER(pPager
cda0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
cdb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cdc0: 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
cdd0: 54 45 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  TE.  if( pPager-
cde0: 3e 64 62 53 69 7a 65 3e 30 20 26 26 20 28 64 63  >dbSize>0 && (dc
cdf0: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
ce00: 54 43 48 5f 41 54 4f 4d 49 43 29 20 29 7b 0a 20  TCH_ATOMIC) ){. 
ce10: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
ce20: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
ce30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
ce40: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 7b 0a  TOMIC_WRITE.  {.
ce50: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 20      int nSector 
ce60: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
ce70: 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
ce80: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
ce90: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
cea0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
ceb0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
cec0: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
ced0: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
cee0: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
cef0: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
cf00: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
cf10: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
cf20: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
cf30: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
cf40: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
cf50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
cf60: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
cf70: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
cf80: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
cf90: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
cfa0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cfb0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
cfc0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
cfd0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
cfe0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
cff0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
d000: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
d010: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
d020: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
d030: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
d040: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
d050: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
d060: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
d070: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
d080: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
d090: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
d0a0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
d0b0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
d0c0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
d0d0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
d0e0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
d0f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
d100: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
d110: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
d120: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
d130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
d140: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
d150: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
d160: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
d170: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
d180: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
d190: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
d1a0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
d1b0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
d1c0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
d1d0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
d1e0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
d1f0: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
d200: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
d210: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
d220: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
d230: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
d240: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
d250: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
d260: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
d270: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
d280: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
d290: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
d2a0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
d2b0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
d2c0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
d2d0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
d2e0: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
d2f0: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
d300: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
d310: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
d320: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
d330: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
d340: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
d350: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
d360: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
d370: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
d380: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
d390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
d3a0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
d3b0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
d3c0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
d3d0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
d3e0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
d3f0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
d400: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
d410: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
d420: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
d430: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
d440: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
d450: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
d460: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
d470: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
d480: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
d490: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
d4a0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
d4b0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
d4c0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
d4d0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
d4e0: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
d4f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d500: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
d510: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
d520: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
d530: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
d540: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
d550: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
d560: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
d570: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
d580: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
d590: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
d5a0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
d5b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d5c0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
d5d0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
d5e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
d5f0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
d600: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
d610: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
d620: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
d630: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
d640: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
d650: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
d660: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
d670: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
d680: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
d690: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
d6a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
d6b0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
d6c0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
d6d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
d6e0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
d6f0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
d700: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
d710: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
d720: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
d730: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
d740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
d750: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
d760: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
d770: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
d780: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
d790: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
d7a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
d7b0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
d7c0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
d7d0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
d7e0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
d7f0: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
d800: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
d810: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
d820: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
d830: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
d840: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
d850: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
d860: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
d870: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
d880: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
d890: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
d8a0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
d8b0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
d8c0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
d8d0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d8e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
d8f0: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
d900: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
d910: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
d920: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
d930: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d940: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
d950: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
d960: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
d970: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
d980: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d9b0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9d0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
d9e0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
d9f0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
da00: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
da10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
da20: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
da30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
da40: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
da50: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
da60: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
da70: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
da80: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
da90: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dab0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
dac0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
dad0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
dae0: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
daf0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
db00: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
db10: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
db20: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
db30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
db40: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
db50: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
db60: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
db70: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
db80: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
db90: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
dba0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
dbb0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a  er .   || len>sz
dbc0: 4a 2d 31 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d  J-16.   || len==
dbd0: 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  0 .   || SQLITE_
dbe0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
dbf0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
dc00: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
dc10: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
dc20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
dc30: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
dc40: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
dc50: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
dc60: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
dc70: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
dc80: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
dc90: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
dca0: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
dcb0: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
dcc0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dcd0: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
dce0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
dcf0: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
dd00: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
dd10: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
dd20: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
dd30: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
dd40: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
dd50: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
dd60: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
dd70: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
dd80: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
dd90: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
dda0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
ddb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ddc0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
ddd0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
dde0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
ddf0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
de00: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
de10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
de20: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
de30: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
de40: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
de50: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
de60: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
de70: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
de80: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
de90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
dea0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
deb0: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
dec0: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
ded0: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
dee0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
def0: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
df00: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
df10: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
df20: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
df30: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
df40: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
df50: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
df60: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
df70: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
df80: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
df90: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfc0: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
e030: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e040: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
e050: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
e060: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
e070: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
e080: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
e090: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
e0a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
e0b0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
e0c0: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
e0d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e0e0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
e0f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e100: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
e110: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
e120: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
e130: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e140: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
e150: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
e160: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
e170: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
e180: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
e190: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
e1a0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
e1b0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
e1c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
e1d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
e1e0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
e1f0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
e200: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
e210: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
e220: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
e230: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
e240: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
e250: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
e260: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
e270: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
e280: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
e290: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
e2a0: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
e2b0: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
e2c0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
e2d0: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
e2e0: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
e2f0: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
e300: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
e310: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
e320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e330: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
e340: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
e350: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
e360: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
e370: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e380: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
e390: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
e3a0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
e3b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
e3c0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
e3d0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
e3e0: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
e3f0: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
e400: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
e410: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
e420: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
e430: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
e440: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
e450: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
e460: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
e470: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
e480: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
e490: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
e4a0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
e4b0: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
e4c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
e4d0: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
e4e0: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
e4f0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
e500: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
e510: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
e520: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
e530: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
e540: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
e550: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
e560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e580: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
e590: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
e5a0: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
e5b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e5c0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
e5f0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
e600: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
e610: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
e620: 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49  !sqlite3JournalI
e630: 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
e640: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
e650: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e660: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
e670: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
e680: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
e690: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
e6a0: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
e6b0: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
e6c0: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
e6d0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
e6e0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
e6f0: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
e700: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e710: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
e720: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
e730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
e740: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
e750: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
e760: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e770: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
e780: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
e790: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
e7a0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
e7b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e7c0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
e7d0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
e7e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
e7f0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
e800: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
e810: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
e820: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
e830: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
e840: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
e850: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
e860: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
e870: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
e880: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
e890: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
e8a0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
e8b0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
e8c0: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
e8d0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
e8e0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
e8f0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
e900: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
e910: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
e920: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
e930: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
e940: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
e950: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
e960: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
e970: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
e980: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
e990: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e9a0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
e9b0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
e9c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e9d0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e9e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
e9f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
ea00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
ea10: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
ea20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ea30: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
ea40: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
ea50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ea60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ea70: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
ea80: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
ea90: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
eaa0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
eab0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
eac0: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
ead0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
eae0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
eaf0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
eb00: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
eb10: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
eb20: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
eb30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
eb40: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
eb50: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
eb60: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
eb70: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
eb80: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
eb90: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
eba0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
ebb0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
ebc0: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
ebd0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
ebe0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
ebf0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
ec00: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
ec10: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
ec20: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
ec30: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
ec40: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
ec50: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
ec60: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
ec70: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
ec80: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
ec90: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
eca0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
ecb0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
ecc0: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
ecd0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
ece0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
ecf0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
ed00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ed20: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ed30: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
ed40: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
ed50: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
ed60: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
ed70: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
ed80: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
ed90: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
eda0: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
edb0: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
edc0: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
edd0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
ee00: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
ee10: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
ee20: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ee50: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
ee60: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
ee70: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
ee80: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
ee90: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
eea0: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
eeb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
eec0: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
eed0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
eee0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
eef0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ef00: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
ef10: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ef20: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
ef30: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
ef40: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
ef50: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
ef60: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
ef70: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
ef80: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
ef90: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
efa0: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
efb0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
efc0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
efd0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
efe0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
eff0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
f000: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
f010: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
f020: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
f030: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
f040: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
f050: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
f060: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f070: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
f080: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
f090: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
f0a0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
f0b0: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
f0c0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
f0d0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
f0e0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
f0f0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
f100: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
f110: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
f120: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
f130: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
f140: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
f150: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
f160: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
f170: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
f180: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
f190: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
f1a0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
f1b0: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
f1c0: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
f1d0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
f1e0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
f1f0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
f200: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
f210: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
f220: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
f230: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
f240: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
f250: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
f260: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
f270: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
f280: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f290: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
f2a0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
f2b0: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
f2c0: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
f2d0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
f2e0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
f2f0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
f300: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
f310: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
f320: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
f330: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
f340: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
f350: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
f360: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
f370: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
f380: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
f390: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
f3a0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
f3b0: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
f3c0: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
f3d0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
f3e0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
f3f0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
f400: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
f410: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
f420: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
f430: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
f440: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
f450: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
f460: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
f470: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
f480: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f490: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
f4a0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
f4b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
f4c0: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
f4d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
f4e0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
f4f0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
f500: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
f510: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
f520: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
f530: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
f540: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
f550: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
f560: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f570: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f580: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
f590: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f5a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
f5b0: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
f5c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
f5d0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
f5e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f5f0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
f600: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
f610: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
f620: 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  izer */ .  sqlit
f630: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
f640: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
f650: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
f660: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
f670: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f680: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f690: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
f6a0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
f6b0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
f6c0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
f6d0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f6e0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f6f0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
f700: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
f710: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
f720: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
f730: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
f740: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
f750: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f760: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f770: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
f780: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
f790: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
f7a0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f7b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f7c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f7d0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
f7e0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
f7f0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
f800: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
f810: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
f820: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
f830: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
f840: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f850: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
f860: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
f870: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
f880: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
f890: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
f8a0: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
f8b0: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
f8c0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
f8d0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
f8e0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
f8f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f900: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
f910: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
f920: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
f930: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
f940: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
f950: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
f960: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
f970: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
f980: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
f990: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
f9a0: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
f9b0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
f9c0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
f9d0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
f9e0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
f9f0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
fa00: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
fa10: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
fa20: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
fa30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
fa40: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
fa50: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
fa60: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
fa70: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
fa80: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
fa90: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
faa0: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
fab0: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
fac0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
fad0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
fae0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
faf0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
fb00: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
fb10: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
fb20: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
fb30: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
fb40: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
fb50: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
fb60: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
fb70: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
fb80: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
fb90: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
fba0: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
fbb0: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
fbc0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
fbd0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
fbe0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
fbf0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
fc00: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
fc10: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
fc20: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
fc30: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
fc40: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
fc50: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
fc60: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
fc70: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
fc80: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
fc90: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
fca0: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
fcb0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
fcc0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
fcd0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
fce0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
fcf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
fd00: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
fd10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
fd20: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
fd30: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
fd40: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
fd50: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
fd60: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
fd70: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
fd80: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
fd90: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
fda0: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
fdb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fdc0: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
fdd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fde0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
fdf0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
fe00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fe10: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
fe20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
fe30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
fe40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
fe50: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
fe60: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
fe70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fe80: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
fe90: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
fea0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
feb0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
fec0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
fed0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
fee0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
fef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ff00: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
ff10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ff20: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
ff30: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
ff40: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
ff50: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
ff60: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
ff70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
ff80: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
ff90: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
ffa0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ffb0: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ffc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
ffd0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
ffe0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
fff0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
10000 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
10010 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
10020 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
10030 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
10040 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
10050 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
10060 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
10070 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
10080 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10090 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
100a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
100b0 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
100c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
100d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
100e0 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
100f0 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
10100 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
10110 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
10120 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
10130 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
10140 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
10150 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
10160 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
10170 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10180 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
10190 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
101a0 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
101b0 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
101c0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
101d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
101e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
101f0 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
10200 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
10210 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10220 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
10230 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
10240 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
10250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10260 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
10270 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
10280 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
10290 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
102a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
102b0 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
102c0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
102d0 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
102e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10300 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10310 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10320 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
10330 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
10340 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
10350 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
10360 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
10370 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10380 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
10390 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
103a0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
103b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
103c0 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
103d0 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
103e0 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
103f0 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
10400 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
10410 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
10420 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
10430 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
10440 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
10450 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
10460 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
10470 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
10480 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
10490 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
104a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
104b0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
104c0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
104d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
104e0 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
104f0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
10500 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
10510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10520 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
10530 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10540 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10550 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
10560 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
10570 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
10580 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
10590 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
105a0 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
105b0 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
105c0 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
105d0 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
105e0 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
105f0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10600 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
10610 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
10620 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
10630 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
10640 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
10650 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
10660 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
10670 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
10680 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
10690 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
106a0 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
106b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
106c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
106d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
106e0 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
106f0 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
10700 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
10710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10720 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10730 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
10740 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
10750 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
10760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
10770 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
10780 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
10790 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
107a0 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
107b0 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
107c0 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
107d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
107e0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
107f0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
10800 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
10810 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
10820 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10830 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10840 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
10850 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
10860 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
10870 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10880 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
10890 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
108a0 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
108b0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
108c0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
108d0 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
108e0 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
108f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10900 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
10910 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
10920 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
10930 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10940 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
10950 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
10960 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
10970 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
10980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
10990 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
109a0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
109b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
109c0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
109d0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
109e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
109f0 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
10a00 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10a10 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10a20 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a30 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
10a40 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
10a50 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10a60 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10a70 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
10a80 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
10a90 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
10aa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
10ab0 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
10ac0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
10ad0 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
10ae0 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10af0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
10b00 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
10b10 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
10b20 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
10b30 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
10b40 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
10b50 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
10b60 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
10b70 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
10b80 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10b90 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
10ba0 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
10bb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
10bc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
10bd0 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
10be0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
10bf0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
10c00 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
10c10 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
10c20 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
10c30 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
10c40 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
10c50 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
10c60 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
10c70 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
10c80 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
10c90 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
10ca0 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
10cb0 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
10cc0 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
10cd0 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
10ce0 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
10cf0 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
10d00 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
10d10 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
10d20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
10d30 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
10d40 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
10d50 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
10d60 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
10d70 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
10d80 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
10d90 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
10da0 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
10db0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10dc0 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
10dd0 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
10de0 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
10df0 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
10e00 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
10e10 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
10e20 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
10e30 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10e40 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
10e50 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
10e60 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
10e70 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
10e80 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
10e90 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
10ea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
10eb0 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
10ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10ed0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
10ee0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10ef0 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
10f00 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
10f10 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10f20 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
10f30 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
10f40 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
10f50 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
10f60 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
10f70 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
10f80 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
10f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
10fa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
10fb0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
10fc0 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
10fd0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
10fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10ff0 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
11000 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
11010 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
11020 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
11030 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
11040 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
11050 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
11060 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
11070 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
11080 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
11090 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
110a0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
110b0 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
110c0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
110d0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
110e0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
110f0 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
11100 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
11110 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
11120 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
11130 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
11140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
11150 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
11160 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
11170 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
11180 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
11190 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
111a0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
111b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
111c0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
111d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
111e0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
111f0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
11200 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
11210 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
11220 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
11230 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
11240 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
11250 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
11260 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
11270 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
11280 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
11290 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
112a0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
112b0 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
112c0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
112d0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
112e0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
112f0 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
11300 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
11310 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
11320 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
11330 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
11340 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
11350 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
11360 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
11370 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
11380 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
11390 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
113a0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
113b0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
113c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
113d0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
113e0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
113f0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
11400 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
11410 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
11420 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
11430 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
11440 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
11450 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
11460 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
11470 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
11480 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
11490 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
114a0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
114b0 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
114c0 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
114d0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
114e0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
114f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
11500 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
11510 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
11520 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
11530 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
11540 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11560 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11570 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
11580 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
11590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
115a0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
115b0 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
115c0 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115e0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
115f0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
11600 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
11610 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
11620 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11630 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
11640 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
11650 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11670 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
11680 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
11690 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
116a0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
116b0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
116c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
116d0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
116e0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
116f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
11700 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11710 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21  _MEMORY .   || !
11720 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
11730 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  fd).  ){.    ret
11740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11750 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
11760 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
11770 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
11780 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
11790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
117a0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
117b0 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
117c0 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
117d0 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
117e0 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
117f0 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
11800 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
11810 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
11820 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11830 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
11840 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
11850 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
11860 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
11870 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
11880 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
11890 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
118a0 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
118b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
118c0 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
118d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
118e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
118f0 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
11900 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
11910 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
11920 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
11930 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
11940 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
11950 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
11960 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
11970 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
11980 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
11990 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
119a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
119b0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
119c0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
119d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
119e0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
119f0 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
11a00 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11a10 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11a20 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
11a30 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
11a40 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11a50 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11a60 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
11a70 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
11a80 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
11a90 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11aa0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11ab0 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11ac0 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
11ad0 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
11ae0 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11af0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11b00 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
11b10 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
11b20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
11b30 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
11b40 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
11b50 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a  ournalMagic, 8,.
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
11b90 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
11ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11bb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11bc0 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
11bd0 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
11be0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
11bf0 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
11c00 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
11c10 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
11c20 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
11c30 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11c40 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11c50 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
11c60 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
11c70 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
11c80 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
11c90 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
11ca0 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
11cb0 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11cc0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11cd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
11ce0 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
11cf0 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
11d00 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
11d10 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
11d20 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
11d30 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11d40 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11d50 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
11d60 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
11d70 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
11d80 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
11d90 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
11da0 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
11db0 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11dc0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11dd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
11de0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
11df0 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
11e00 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
11e10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11e20 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
11e30 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11e40 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11e50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11e60 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
11e70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
11e80 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
11e90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11ea0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
11eb0 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11ec0 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11ed0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
11ee0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74  {.  pPager->iDat
11ef0 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71  aVersion++;.  sq
11f00 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
11f10 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
11f20 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  up);.  sqlite3Pc
11f30 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
11f40 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
11f50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11f60 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11f70 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33  sion value.*/.u3
11f80 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 61  2 sqlite3PagerDa
11f90 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20  taVersion(Pager 
11fa0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
11fb0 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  rn pPager->iData
11fc0 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  Version;.}../*.*
11fd0 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
11fe0 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
11ff0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
12000 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
12010 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
12020 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
12030 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
12040 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
12050 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
12060 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
12070 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
12080 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12090 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
120a0 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
120b0 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
120c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
120d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
120e0 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
120f0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
12100 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
12110 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
12120 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
12130 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
12140 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
12150 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
12160 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
12170 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
12180 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12190 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
121a0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
121b0 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
121c0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
121d0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
121e0 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
121f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12200 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
12210 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
12220 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
12230 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
12240 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
12250 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
12260 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
12270 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
12280 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
12290 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
122a0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
122b0 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
122c0 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
122d0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
122e0 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
122f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
12300 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
12310 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
12320 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
12330 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
12340 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
12350 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
12380 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
12390 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
123a0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
123b0 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
123c0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
123d0 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
123e0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
123f0 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
12400 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
12410 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
12420 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
12430 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
12440 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
12450 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
12460 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
12470 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
12480 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
12490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
124a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
124b0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
124c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
124d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
124e0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a  T_CONCURRENT./*.
124f0 2a 2a 20 49 66 20 74 68 65 79 20 61 72 65 20 6e  ** If they are n
12500 6f 74 20 61 6c 72 65 61 64 79 2c 20 62 65 67 69  ot already, begi
12510 6e 20 72 65 63 6f 72 64 69 6e 67 20 61 6c 6c 20  n recording all 
12520 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
12530 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 0a  the pager layer.
12540 2a 2a 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ** by the b-tree
12550 20 6c 61 79 65 72 20 54 68 69 73 20 69 73 20 75   layer This is u
12560 73 65 64 20 62 79 20 63 6f 6e 63 75 72 72 65 6e  sed by concurren
12570 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  t transactions. 
12580 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
12590 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
125a0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
125b0 65 72 72 6f 72 20 63 6f 64 65 20 28 53 51 4c 49  error code (SQLI
125c0 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20  TE_NOMEM) if an 
125d0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
125e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
125f0 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72 72  agerBeginConcurr
12600 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
12610 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
12620 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
12630 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
12640 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
12650 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20 73 71  r->pAllRead = sq
12660 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
12670 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
12680 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
12690 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
126a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
126b0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
126c0 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Read==0 ){.     
126d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
126e0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
126f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12700 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12710 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
12720 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 70 20 72 65 63  ).**.** Stop rec
12730 6f 72 64 69 6e 67 20 61 6c 6c 20 70 61 67 65 73  ording all pages
12740 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
12750 61 67 65 72 20 6c 61 79 65 72 20 62 79 20 74 68  ager layer by th
12760 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a  e b-tree layer.*
12770 2a 20 61 6e 64 20 64 69 73 63 61 72 64 20 61 6e  * and discard an
12780 79 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  y current record
12790 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
127a0 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72  e3PagerEndConcur
127b0 72 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  rent(Pager *pPag
127c0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69  er){.  sqlite3Bi
127d0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
127e0 65 72 2d 3e 70 41 6c 6c 52 65 61 64 29 3b 0a 20  er->pAllRead);. 
127f0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
12800 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  d = 0;.}../* !de
12810 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12820 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
12830 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
12840 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
12850 69 73 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e 20  is in wal mode. 
12860 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  False otherwise.
12870 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12880 61 67 65 72 49 73 57 61 6c 28 50 61 67 65 72 20  agerIsWal(Pager 
12890 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
128a0 72 6e 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 21  rn pPager->pWal!
128b0 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =0;.}.#endif /* 
128c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
128d0 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  URRENT */../*.**
128e0 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72 2e   Free the Pager.
128f0 70 49 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  pInJournal and P
12900 61 67 65 72 2e 70 41 6c 6c 52 65 61 64 20 62 69  ager.pAllRead bi
12910 74 76 65 63 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  tvec objects..*/
12920 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12930 65 72 46 72 65 65 42 69 74 76 65 63 73 28 50 61  erFreeBitvecs(Pa
12940 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
12950 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
12960 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
12970 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
12980 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
12990 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   0;.  sqlite3Pag
129a0 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28  erEndConcurrent(
129b0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
129c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
129d0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
129e0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
129f0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
12a00 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
12a10 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
12a20 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
12a30 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
12a40 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
12a50 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
12a60 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
12a70 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
12a80 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
12a90 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
12aa0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
12ab0 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
12ac0 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
12ad0 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
12ae0 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
12af0 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
12b00 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
12b10 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
12b20 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
12b30 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
12b40 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
12b50 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12b60 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
12b70 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12b80 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
12b90 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
12ba0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12bb0 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
12bc0 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
12bd0 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
12be0 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
12bf0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
12c00 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12c10 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
12c20 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
12c30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
12c40 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
12c50 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
12c60 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
12c70 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
12c80 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
12c90 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
12ca0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
12cb0 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
12cc0 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
12cd0 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
12ce0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
12cf0 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
12d00 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
12d10 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
12d20 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
12d30 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
12d40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12d50 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
12d60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
12d70 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
12d80 29 3b 0a 0a 20 20 70 61 67 65 72 46 72 65 65 42  );..  pagerFreeB
12d90 69 74 76 65 63 73 28 70 50 61 67 65 72 29 3b 0a  itvecs(pPager);.
12da0 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
12db0 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
12dc0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
12dd0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
12de0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
12df0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
12e00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
12e10 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
12e20 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
12e30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12e40 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
12e50 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
12e60 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
12e70 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
12e80 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
12ea0 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
12eb0 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
12ec0 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
12ed0 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
12ee0 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
12ef0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
12f00 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
12f10 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
12f20 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
12f30 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
12f40 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
12f50 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
12f60 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
12f70 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
12f80 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
12f90 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
12fa0 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
12fb0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
12fc0 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
12fd0 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
12fe0 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
12ff0 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
13000 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
13010 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
13020 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
13030 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
13040 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
13050 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13060 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
13070 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
13080 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
13090 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
130a0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
130b0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
130c0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
130d0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
130e0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
130f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
13100 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
13110 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
13120 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13130 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
13140 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
13150 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
13160 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
13170 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
13180 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
13190 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
131a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
131b0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
131c0 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
131d0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
131e0 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
131f0 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
13200 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
13210 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
13220 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
13230 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
13240 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
13250 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
13260 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
13270 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
13280 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
13290 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
132a0 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
132b0 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
132c0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
132d0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
132e0 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
132f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13300 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
13310 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
13320 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
13330 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
13340 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
13350 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
13360 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
13370 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
13380 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
13390 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
133a0 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
133b0 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
133c0 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
133d0 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
133e0 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
133f0 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
13400 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
13410 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
13420 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
13430 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13440 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
13450 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13460 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
13470 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13480 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
13490 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
134a0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
134b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
134c0 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
134d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
134e0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
134f0 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
13500 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
13510 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
13520 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
13530 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
13540 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
13550 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
13560 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
13570 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
13580 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
13590 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
135a0 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
135b0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
135c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
135d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
135e0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
135f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
13600 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
13610 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
13620 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
13630 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
13640 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
13650 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
13660 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
13670 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
13680 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  N;.    }else{.  
13690 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
136a0 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61  te = (isOpen(pPa
136b0 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45  ger->jfd) ? PAGE
136c0 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52  R_OPEN : PAGER_R
136d0 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  EADER);.    }.  
136e0 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
136f0 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
13700 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
13710 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
13720 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13740 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
13750 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
13760 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13770 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
13780 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
13790 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
137a0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
137b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
137c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
137d0 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
137e0 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
137f0 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
13800 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
13810 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
13820 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
13830 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
13840 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
13850 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
13860 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
13870 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
13880 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
13890 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
138a0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
138b0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
138c0 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
138d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
138e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
138f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
13900 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
13910 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
13920 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
13930 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
13940 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
13950 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
13960 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
13970 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
13980 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
13990 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
139a0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
139b0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
139c0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
139d0 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
139e0 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
139f0 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
13a00 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
13a10 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
13a20 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
13a30 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
13a40 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
13a50 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
13a60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13a70 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
13a80 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
13a90 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
13aa0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
13ab0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
13ac0 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
13ad0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
13ae0 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
13af0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13b00 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
13b10 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
13b20 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
13b30 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
13b40 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
13b50 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
13b60 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
13b70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13b80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13b90 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
13ba0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
13bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13bc0 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
13bd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
13be0 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
13bf0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
13c00 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
13c10 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
13c20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
13c30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13c40 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
13c50 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
13c60 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
13c70 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
13c80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
13c90 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
13ca0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
13cb0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
13cc0 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
13cd0 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
13ce0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
13cf0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
13d00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
13d10 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65  OR;.    setGette
13d20 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
13d30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13d40 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
13d50 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
13d60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
13d70 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
13d80 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e  * The write tran
13d90 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20  saction open on 
13da0 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20  pPager is being 
13db0 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d  committed (bComm
13dc0 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c  it==1).** or rol
13dd0 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69  led back (bCommi
13de0 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  t==0)..**.** Ret
13df0 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20  urn TRUE if and 
13e00 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74  only if all dirt
13e10 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  y pages should b
13e20 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
13e30 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a  k..**.** Rules:.
13e40 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e  **.**   *  For n
13e50 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65  on-TEMP database
13e60 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74  s, always sync t
13e70 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73  o disk.  This is
13e80 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20   necessary.**   
13e90 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69     for transacti
13ea0 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c  ons to be durabl
13eb0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79  e..**.**   *  Sy
13ec0 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  nc TEMP database
13ed0 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49   only on a COMMI
13ee0 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43  T (not a ROLLBAC
13ef0 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b  K) when the back
13f00 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  ing.**      file
13f10 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
13f20 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61  d already (via a
13f30 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53   spill on pagerS
13f40 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20  tress()) and.** 
13f50 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75       when the nu
13f60 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61  mber of dirty pa
13f70 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78  ges in memory ex
13f80 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65  ceeds 25% of the
13f90 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63   total.**      c
13fa0 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  ache size..*/.st
13fb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c  atic int pagerFl
13fc0 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65  ushOnCommit(Page
13fd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62  r *pPager, int b
13fe0 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70  Commit){.  if( p
13ff0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
14000 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
14010 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20   if( !bCommit ) 
14020 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14030 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
14040 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
14050 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65    return (sqlite
14060 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69  3PCachePercentDi
14070 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
14080 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a  che)>=25);.}../*
14090 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
140a0 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
140b0 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
140c0 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
140d0 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
140e0 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
140f0 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
14100 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
14110 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
14120 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
14130 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
14140 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
14150 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
14160 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
14170 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
14180 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
14190 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
141a0 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
141b0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
141c0 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
141d0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
141e0 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
141f0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
14200 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
14210 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
14220 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
14230 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
14240 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
14250 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
14260 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
14270 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
14280 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
14290 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
142a0 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
142b0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
142c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
142d0 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
142e0 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
142f0 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
14300 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
14310 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
14320 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
14330 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
14340 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
14350 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
14360 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
14370 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
14380 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
14390 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
143a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
143b0 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
143c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
143d0 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
143e0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
143f0 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
14400 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
14410 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
14420 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
14430 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
14440 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
14450 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
14460 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
14470 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
14480 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
14490 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
144a0 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
144b0 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
144c0 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
144d0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
144e0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
144f0 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
14500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
14510 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
14520 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
14530 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
14540 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
14550 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
14560 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
14570 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
14580 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
14590 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
145a0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
145b0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
145c0 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
145d0 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
145e0 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
145f0 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
14600 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
14610 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
14620 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
14630 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
14640 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
14650 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
14660 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
14670 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
14680 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
14690 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
146a0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
146b0 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
146c0 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
146d0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
146e0 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
146f0 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
14700 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
14710 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
14720 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
14730 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
14740 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
14750 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
14760 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
14770 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
14780 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
14790 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
147a0 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
147b0 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
147c0 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
147d0 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
147e0 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
147f0 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
14800 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
14810 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
14820 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
14830 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
14840 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
14850 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
14860 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
14870 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
14880 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
14890 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
148a0 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
148b0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
148c0 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
148d0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
148e0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
148f0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14900 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
14910 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
14920 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
14930 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
14940 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
14950 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
14960 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
14970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14980 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
14990 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
149a0 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
149b0 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
149c0 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
149d0 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
149e0 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
149f0 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
14a00 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
14a10 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
14a20 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
14a30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
14a40 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
14a50 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
14a60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14a70 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
14a80 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
14a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
14aa0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14ab0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
14ac0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
14ad0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
14ae0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
14af0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14b00 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
14b10 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
14b20 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
14b30 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
14b40 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
14b50 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
14b60 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
14b70 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
14b80 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
14b90 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
14ba0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
14bb0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
14bc0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14bd0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
14be0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
14bf0 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
14c00 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
14c10 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
14c20 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
14c30 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
14c40 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
14c50 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
14c60 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
14c70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
14c80 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
14c90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
14ca0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
14cb0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
14cc0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
14cd0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
14ce0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
14cf0 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
14d00 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
14d10 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
14d20 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
14d30 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
14d40 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
14d50 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
14d60 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
14d70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
14d80 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
14d90 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14da0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
14db0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
14dc0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
14dd0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
14de0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14df0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
14e00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
14e10 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
14e20 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
14e30 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
14e40 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
14e50 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
14e60 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
14e70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14e80 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
14e90 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
14ea0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
14eb0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14ec0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
14ed0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
14ee0 30 20 0a 20 20 20 20 20 20 7c 7c 20 28 73 71 6c  0 .      || (sql
14ef0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
14f00 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
14f10 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
14f20 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
14f30 43 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 73  C).  );.  if( is
14f40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
14f50 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
14f60 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
14f70 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
14f80 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
14f90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
14fa0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f     if( sqlite3Jo
14fb0 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
14fc0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
14fd0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
14fe0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14ff0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
15000 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
15010 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
15020 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
15030 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
15040 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
15050 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
15060 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
15070 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
15080 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
15090 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
150a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
150b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
150c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
150d0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
150e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
150f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
15100 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15110 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
15120 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
15130 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
15140 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72   file size is wr
15150 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
15160 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61 79 2e  node right away.
15170 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  .          ** Ot
15180 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72  herwise the jour
15190 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72  nal might resurr
151a0 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ect following a 
151b0 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20  power loss and. 
151c0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73           ** caus
151d0 65 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73  e the last trans
151e0 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62  action to roll b
151f0 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20  ack.  See.      
15200 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62      ** https://b
15210 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e  ugzilla.mozilla.
15220 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  org/show_bug.cgi
15230 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20  ?id=1072773.    
15240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15260 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
15270 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
15280 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  lags);.        }
15290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
152a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
152b0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
152c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
152d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
152e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
152f0 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
15300 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
15310 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
15320 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
15330 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
15340 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
15350 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
15360 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
15370 61 73 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74  aster||pPager->t
15380 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
15390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
153a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
153b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
153c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
153d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
153e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
153f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
15400 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15410 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
15420 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
15430 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
15440 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
15450 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
15460 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
15470 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
15480 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
15490 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
154a0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
154b0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
154c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20  emory journal.. 
154d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
154e0 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61  t bDelete = !pPa
154f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
15500 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
15510 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
15520 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
15530 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  d)==0 );.      a
15540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
15550 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
15560 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
15570 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
15580 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
15590 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
155a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
155b0 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
155c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
155d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
155e0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
155f0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
15600 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
15610 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
15620 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20  f( bDelete ){.  
15630 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15640 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
15650 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
15660 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
15670 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20  r->extraSync);. 
15680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15690 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
156a0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71  CHECK_PAGES.  sq
156b0 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
156c0 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
156d0 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
156e0 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20  et_pagehash);.  
156f0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
15700 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  ze==0 && sqlite3
15710 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
15720 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
15730 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
15740 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
15750 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  Lookup(pPager, 1
15760 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
15770 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73        p->pageHas
15780 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  h = 0;.      sql
15790 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
157a0 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a  tNull(p);.    }.
157b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 61    }.#endif..  pa
157c0 67 65 72 46 72 65 65 42 69 74 76 65 63 73 28 70  gerFreeBitvecs(p
157d0 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
157e0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
157f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15800 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  ){.    if( MEMDB
15810 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68 4f 6e   || pagerFlushOn
15820 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c 20 62  Commit(pPager, b
15830 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 20  Commit) ){.     
15840 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
15850 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
15860 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c  PCache);.    }el
15870 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
15880 33 50 63 61 63 68 65 43 6c 65 61 72 57 72 69 74  3PcacheClearWrit
15890 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70 50 43  able(pPager->pPC
158a0 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ache);.    }.   
158b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
158c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
158d0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
158e0 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  dbSize);.  }..  
158f0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
15900 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
15910 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77  * Drop the WAL w
15920 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e  rite-lock, if an
15930 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  y. Also, if the 
15940 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69  connection was i
15950 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e  n .    ** lockin
15960 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
15970 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20   mode but is no 
15980 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65  longer, drop the
15990 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20   EXCLUSIVE .    
159a0 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ** lock held on 
159b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
159c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
159d0 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  2 = sqlite3WalEn
159e0 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  dWriteTransactio
159f0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
15a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32  .    assert( rc2
15a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
15a20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
15a30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
15a40 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e 64  mit && pPager->d
15a50 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65 72  bFileSize>pPager
15a60 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
15a70 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
15a80 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d  s taken when com
15a90 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
15aa0 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63  ction in rollbac
15ab0 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  k-journal.    **
15ac0 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61 74   mode if the dat
15ad0 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
15ae0 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  sk is larger tha
15af0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
15b00 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20  mage..    ** At 
15b10 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 6a  this point the j
15b20 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
15b30 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74 68  finalized and th
15b40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
15b50 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
15b60 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75  ly committed, bu
15b70 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  t the EXCLUSIVE 
15b80 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68 65  lock is still he
15b90 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ld on the.    **
15ba0 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73 20   file. So it is 
15bb0 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74 65  safe to truncate
15bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15bd0 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  le to its minimu
15be0 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  m.    ** require
15bf0 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20  d size.  */.    
15c00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15c10 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
15c20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  _LOCK );.    rc 
15c30 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
15c40 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
15c50 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
15c60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15c70 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 29 7b  OK && bCommit ){
15c80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15c90 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
15ca0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
15cb0 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
15cc0 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
15cd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15ce0 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
15cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15d00 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
15d10 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
15d20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
15d30 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
15d40 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
15d50 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
15d60 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
15d70 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
15d80 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
15d90 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
15da0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
15db0 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
15dc0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
15dd0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
15de0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
15df0 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
15e00 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
15e10 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
15e20 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
15e30 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
15e40 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
15e50 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
15e60 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
15e70 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
15e80 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
15e90 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
15ea0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
15eb0 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
15ec0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
15ed0 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
15ee0 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
15ef0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
15f00 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
15f10 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
15f20 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
15f30 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
15f40 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
15f50 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
15f60 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
15f70 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
15f80 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
15f90 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
15fa0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
15fb0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
15fc0 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
15fd0 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
15fe0 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
15ff0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
16000 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
16010 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
16020 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
16030 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
16040 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
16050 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
16060 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
16070 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
16080 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
16090 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
160a0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
160b0 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
160c0 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
160d0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
160e0 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
160f0 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
16100 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
16110 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
16120 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
16130 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
16140 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
16150 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
16160 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
16170 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
16180 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
16190 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
161a0 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
161b0 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
161c0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
161d0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
161e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
161f0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
16200 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
16210 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
16220 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
16230 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
16240 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
16250 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
16260 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
16270 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
16280 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
16290 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
162a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
162b0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
162c0 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
162d0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
162e0 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
162f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
16300 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
16310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
16320 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
16330 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
16340 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
16350 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
16360 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
16370 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
16380 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
16390 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
163a0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
163b0 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
163c0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
163d0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
163e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
163f0 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
16400 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
16410 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
16420 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
16430 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
16440 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
16450 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
16460 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
16470 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
16480 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
16490 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
164a0 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
164b0 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
164c0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
164d0 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
164e0 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
164f0 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
16500 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
16510 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
16520 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
16530 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
16540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
16550 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
16560 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
16570 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
16580 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
16590 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
165a0 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
165b0 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
165c0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
165d0 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
165e0 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
165f0 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
16600 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
16610 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
16620 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
16630 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
16640 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
16650 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
16660 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
16670 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
16680 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
16690 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
166a0 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
166b0 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
166c0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
166d0 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
166e0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
166f0 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
16700 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
16710 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
16720 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
16730 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
16740 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
16750 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
16760 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
16770 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
16780 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
16790 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
167a0 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
167b0 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
167c0 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
167d0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
167e0 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
167f0 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
16800 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
16810 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
16820 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16830 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
16840 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
16850 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
16860 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
16870 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
16880 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
16890 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
168a0 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
168b0 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
168c0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
168f0 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
16900 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
16910 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
16920 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
16930 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
16940 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
16950 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
16960 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
16970 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
16980 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16990 72 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65  rved bits is the
169a0 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73   same in the des
169b0 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65  tination.** page
169c0 72 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68  r as it is in th
169d0 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20  e source.  This 
169e0 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20  comes up when a 
169f0 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74  VACUUM changes t
16a00 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
16a10 72 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f  reserved bits to
16a20 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61   the "optimal" a
16a30 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mount..*/.void s
16a40 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e  qlite3PagerAlign
16a50 52 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70  Reserve(Pager *p
16a60 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72  Dest, Pager *pSr
16a70 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d  c){.  if( pDest-
16a80 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d  >nReserve!=pSrc-
16a90 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20  >nReserve ){.   
16aa0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
16ab0 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76   = pSrc->nReserv
16ac0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
16ad0 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20  rtSize(pDest);. 
16ae0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
16af0 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
16b00 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
16b10 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
16b20 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
16b30 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
16b40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16b50 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
16b60 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
16b70 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
16b80 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
16b90 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
16ba0 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
16bb0 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
16bc0 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
16bd0 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
16be0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
16bf0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
16c00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
16c10 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16c20 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73  l uses checksums
16c30 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
16c40 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a   journal does .*
16c50 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  * not..**.** If 
16c60 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16c70 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
16c80 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
16c90 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
16ca0 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
16cb0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
16cc0 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
16cd0 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
16ce0 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
16cf0 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
16d00 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16d10 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
16d20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
16d30 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
16d40 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
16d50 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
16d60 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
16d70 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
16d80 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
16d90 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
16da0 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
16db0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
16dc0 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
16dd0 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
16de0 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
16df0 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
16e00 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
16e10 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
16e20 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
16e30 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
16e40 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
16e50 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
16e60 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
16e70 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
16e80 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
16e90 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
16ea0 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
16eb0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
16ec0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
16ed0 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
16ee0 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
16ef0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16f00 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
16f10 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
16f20 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
16f30 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
16f40 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
16f50 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
16f60 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
16f70 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
16f80 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
16f90 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
16fa0 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
16fb0 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
16fc0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
16fd0 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
16fe0 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
16ff0 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
17000 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
17010 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
17020 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
17030 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
17040 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
17050 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
17060 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
17070 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
17080 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17090 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
170a0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
170b0 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
170c0 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
170d0 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
170e0 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
170f0 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
17100 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
17110 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
17120 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
17130 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
17140 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
17150 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
17160 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
17170 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
17180 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
17190 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
171a0 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
171b0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
171c0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
171d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
171e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
171f0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
17200 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
17210 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
17220 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
17230 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
17240 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  k */.  i64 *pOff
17250 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
17260 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
17270 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
17280 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
17290 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20   *pDone,        
172a0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
172b0 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
172c0 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
172d0 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72  /.  int isMainJr
172e0 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nl,             
172f0 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a    /* 1 -> main j
17300 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62  ournal. 0 -> sub
17310 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69  -journal. */.  i
17320 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20  nt isSavepnt    
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17340 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
17350 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
17360 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
17370 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17390 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
173a0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
173b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173d0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
173e0 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
173f0 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
17400 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17420 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
17430 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
17440 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
17450 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
17460 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
17470 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
17480 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
17490 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
174a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
174b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
174c0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
174d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
174e0 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  sSynced;        
174f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
17500 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65   if journal page
17510 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69   is synced */.#i
17520 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17530 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a  CODEC.  /* The j
17540 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74  rnlEnc flag is t
17550 72 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70  rue if Journal p
17560 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ages should be p
17570 61 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20  assed through.  
17580 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49  ** the codec.  I
17590 74 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70  t is false for p
175a0 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  ure in-memory jo
175b0 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e  urnals. */.  con
175c0 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d  st int jrnlEnc =
175d0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20   (isMainJrnl || 
175e0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
175f0 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66  mory==0);.#endif
17600 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
17610 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
17620 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
17630 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
17640 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
17650 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
17660 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
17670 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
17680 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
17690 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
176a0 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
176b0 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
176c0 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
176d0 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
176e0 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
176f0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
17700 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
17710 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
17720 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
17730 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
17740 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
17750 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
17760 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
17770 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
17780 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
17790 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
177a0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
177b0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
177c0 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
177d0 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
177e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
177f0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
17800 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
17810 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
17820 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
17830 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
17840 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
17850 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
17860 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
17870 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
17880 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
17890 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
178a0 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
178b0 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
178c0 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
178d0 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
178e0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
178f0 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
17900 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
17910 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
17920 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
17930 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17940 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17950 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
17960 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
17970 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
17980 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
17990 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
179a0 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
179b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
179c0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
179d0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
179e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
179f0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
17a00 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
17a10 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
17a20 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
17a30 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
17a40 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
17a50 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
17a60 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
17a70 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
17a80 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
17a90 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
17aa0 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
17ab0 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
17ac0 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
17ad0 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
17ae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17af0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
17b00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
17b10 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
17b20 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17b30 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
17b40 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
17b50 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17b60 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
17b70 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
17b80 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
17b90 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
17ba0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
17bb0 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
17bc0 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
17bd0 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
17be0 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
17bf0 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
17c00 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
17c10 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
17c20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
17c30 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
17c40 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
17c50 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
17c60 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
17c70 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
17c80 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
17c90 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
17ca0 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
17cb0 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
17cc0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
17cd0 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
17ce0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
17cf0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
17d00 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
17d10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17d20 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
17d30 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
17d40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
17d50 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
17d60 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
17d70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17d80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17d90 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
17da0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
17db0 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
17dc0 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
17dd0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
17de0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
17df0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17e00 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
17e10 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
17e20 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
17e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
17e40 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
17e50 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
17e60 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
17e70 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65  n played back be
17e80 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
17e90 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
17ea0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
17eb0 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
17ec0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
17ed0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
17ee0 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
17ef0 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
17f00 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
17f10 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17f20 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17f30 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
17f40 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
17f50 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
17f60 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
17f70 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
17f80 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
17f90 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
17fa0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
17fb0 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
17fc0 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
17fd0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17fe0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
17ff0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
18000 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
18010 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
18020 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
18030 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
18040 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
18050 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
18060 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
18070 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
18080 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
18090 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
180a0 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
180b0 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
180c0 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
180d0 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
180e0 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
180f0 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
18100 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
18110 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
18120 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
18130 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
18140 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
18150 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
18160 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
18170 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
18180 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
18190 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
181a0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
181b0 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
181c0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
181d0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
181e0 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
181f0 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
18200 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
18210 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
18220 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
18230 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
18240 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
18250 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
18260 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
18270 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
18280 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
18290 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
182a0 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
182b0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
182c0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
182d0 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
182e0 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
182f0 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
18300 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
18310 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
18320 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
18330 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
18340 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
18350 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
18360 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
18370 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
18380 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
18390 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
183a0 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
183b0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
183c0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
183d0 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
183e0 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
183f0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
18400 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
18410 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18420 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
18430 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
18440 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
18450 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
18460 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
18470 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
18480 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
18490 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
184a0 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
184b0 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
184c0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
184d0 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
184e0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
184f0 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
18500 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
18510 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
18520 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
18530 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
18540 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
18550 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
18560 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
18570 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
18580 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
18590 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
185a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
185b0 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
185c0 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
185d0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
185e0 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
185f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
18600 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
18610 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
18620 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
18630 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
18640 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
18650 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
18660 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
18670 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
18680 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
18690 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
186a0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
186b0 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
186c0 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
186d0 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
186e0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
186f0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
18700 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
18710 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
18720 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
18730 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
18740 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
18750 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
18760 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
18770 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
18780 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
18790 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
187a0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
187b0 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
187c0 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
187d0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
187e0 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
187f0 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
18800 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
18810 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
18820 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
18830 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
18840 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  se{.    pPg = sq
18850 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
18860 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
18870 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
18880 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
18890 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
188a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
188b0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c  PEN || pPg==0 ||
188c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
188d0 65 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  e );.  PAGERTRAC
188e0 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
188f0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
18900 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
18910 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
18920 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
18930 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
18940 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
18950 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
18960 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
18970 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
18980 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
18990 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
189a0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
189b0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
189c0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
189d0 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
189e0 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
189f0 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
18a00 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
18a10 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
18a20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
18a30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
18a40 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
18a50 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
18a60 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
18a70 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
18a80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
18a90 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
18aa0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
18ab0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
18ac0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
18ad0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
18ae0 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
18af0 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
18b00 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
18b10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
18b20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18b30 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
18b40 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
18b50 20 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20   Write the data 
18b60 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
18b70 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20  urnal back into 
18b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18b90 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  e..    ** This i
18ba0 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65  s usually safe e
18bb0 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79  ven for an encry
18bc0 70 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20  pted database - 
18bd0 61 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  as the data.    
18be0 2a 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64  ** was encrypted
18bf0 20 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77   before it was w
18c00 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
18c10 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
18c20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a  exception.    **
18c30 20 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20   is if the data 
18c40 77 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72  was just read fr
18c50 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
18c60 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  sub-journal. In 
18c70 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65  that.    ** case
18c80 20 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72   it must be encr
18c90 79 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72  ypted here befor
18ca0 65 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  e it is copied i
18cb0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
18cc0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a  .    ** file.  *
18cd0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18ce0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
18cf0 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20  ( !jrnlEnc ){.  
18d00 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
18d10 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
18d20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
18d30 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b  EM_BKPT, aData);
18d40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18d50 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
18d60 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61  r->fd, (u8 *)aDa
18d70 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
18d80 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
18d90 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
18da0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
18db0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18dc0 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c  M_BKPT);.    }el
18dd0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63  se.#endif.    rc
18de0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
18df0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
18e00 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
18e10 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
18e20 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e  t);..    if( pgn
18e30 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
18e40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
18e50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
18e60 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
18e70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
18e80 42 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66  Backup ){.#ifdef
18e90 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
18ea0 43 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c  C.      if( jrnl
18eb0 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43  Enc ){.        C
18ec0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
18ed0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
18ee0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
18ef0 50 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  PT);.        sql
18f00 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
18f10 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
18f20 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
18f30 74 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  ta);.        COD
18f40 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
18f50 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
18f60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
18f70 2c 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  ,aData);.      }
18f80 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
18f90 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
18fa0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
18fb0 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
18fc0 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  *)aData);.    }.
18fd0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
18fe0 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
18ff0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
19000 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
19010 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
19020 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
19030 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
19040 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
19050 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
19060 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
19070 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
19080 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
19090 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
190a0 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
190b0 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
190c0 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
190d0 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
190e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
190f0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
19100 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
19110 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
19120 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
19130 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
19140 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
19150 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
19160 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
19170 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
19180 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
19190 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
191a0 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
191b0 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
191c0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
191d0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
191e0 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
191f0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
19200 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
19210 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
19220 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
19230 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
19240 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
19250 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
19260 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
19270 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
19280 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
19290 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
192a0 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
192b0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
192c0 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
192d0 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
192e0 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
192f0 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
19300 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
19310 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
19320 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
19330 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
19340 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
19350 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
19360 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
19370 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
19380 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
19390 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
193a0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
193b0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
193c0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
193d0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
193e0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
193f0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
19400 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
19410 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
19420 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
19430 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
19440 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
19450 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
19460 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
19470 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
19480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19490 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
194a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
194b0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
194c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
194d0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
194e0 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
194f0 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
19500 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
19510 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
19520 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
19530 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
19540 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
19550 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
19560 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
19570 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
19580 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
19590 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
195a0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
195b0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
195c0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
195d0 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
195e0 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
195f0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
19600 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
19610 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
19620 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
19630 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
19640 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
19650 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
19660 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19670 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
19680 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
19690 20 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62   /* It used to b
196a0 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63  e that sqlite3Pc
196b0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
196c0 67 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65  g) was called he
196d0 72 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  re.  But.    ** 
196e0 74 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61  that call was da
196f0 6e 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20  ngerous and had 
19700 6e 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65  no detectable be
19710 6e 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20  nefit since the 
19720 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20  cache.    ** is 
19730 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64  normally cleaned
19740 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
19750 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65  eCleanAll() afte
19760 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
19770 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  o.    ** has bee
19780 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  n removed. */.  
19790 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
197a0 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
197b0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
197c0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
197d0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
197e0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
197f0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
19800 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
19810 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
19820 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
19830 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
19840 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
19850 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
19860 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
19870 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
19880 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
19890 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
198a0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
198b0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  */.#if SQLITE_HA
198c0 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20  S_CODEC.    if( 
198d0 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43  jrnlEnc ){ CODEC
198e0 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
198f0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
19900 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
19910 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20  KPT); }.#endif. 
19920 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
19930 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
19940 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19950 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
19960 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
19970 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
19980 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
19990 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
199a0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
199b0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
199c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
199d0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
199e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
199f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
19a00 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
19a10 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
19a20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19a30 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
19a40 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
19a50 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
19a60 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
19a70 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
19a80 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
19a90 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
19aa0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
19ab0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
19ac0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
19ad0 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
19ae0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
19af0 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
19b00 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
19b10 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
19b20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
19b30 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
19b40 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
19b50 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
19b60 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
19b70 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
19b80 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
19b90 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
19ba0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
19bb0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
19bc0 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
19bd0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
19be0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
19bf0 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
19c00 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
19c10 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
19c20 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
19c30 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
19c40 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
19c50 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
19c60 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
19c70 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
19c80 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
19c90 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
19ca0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
19cb0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
19cc0 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
19cd0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
19ce0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
19cf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
19d00 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
19d10 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
19d20 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
19d30 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
19d40 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
19d50 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
19d60 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
19d70 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
19d80 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
19d90 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
19da0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
19db0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
19dc0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19dd0 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
19de0 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
19df0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
19e00 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
19e10 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
19e20 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
19e30 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
19e40 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
19e50 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
19e60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
19e70 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
19e80 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
19e90 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
19ea0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
19eb0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
19ec0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
19ed0 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
19ee0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
19ef0 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
19f00 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
19f10 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
19f20 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
19f30 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
19f40 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
19f50 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
19f60 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
19f70 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
19f80 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
19f90 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
19fa0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
19fb0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
19fc0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19fd0 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
19fe0 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
19ff0 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
1a000 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1a010 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
1a020 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
1a030 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
1a040 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
1a050 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
1a060 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
1a070 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a080 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
1a090 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
1a0a0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
1a0b0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
1a0c0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
1a0d0 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
1a0e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a0f0 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
1a100 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
1a110 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
1a120 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a130 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a140 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1a170 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1a180 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
1a190 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
1a1a0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
1a1b0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
1a1c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
1a1d0 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
1a1e0 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
1a1f0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
1a200 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
1a210 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
1a220 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
1a230 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a240 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
1a250 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
1a260 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
1a270 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a280 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
1a290 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
1a2a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1a2b0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
1a2c0 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
1a2d0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
1a2e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
1a2f0 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
1a300 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
1a310 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1a320 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
1a330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
1a340 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
1a350 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
1a360 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
1a370 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1a380 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
1a390 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
1a3a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a3b0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
1a3c0 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
1a3d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a3e0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
1a3f0 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
1a400 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
1a410 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1a420 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
1a430 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
1a440 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
1a450 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
1a460 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
1a470 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
1a480 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
1a490 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a4a0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  M_BKPT;.  }else{
1a4b0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
1a4c0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
1a4d0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
1a4e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1a4f0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
1a500 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1a510 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1a520 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
1a530 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1a540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1a550 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a560 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
1a570 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1a580 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
1a590 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
1a5a0 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
1a5b0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
1a5c0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
1a5d0 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
1a5e0 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
1a5f0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1a600 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
1a610 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
1a620 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
1a630 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
1a640 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
1a650 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
1a660 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
1a670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1a680 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
1a690 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
1a6a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a6b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
1a6c0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
1a6d0 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
1a6e0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
1a6f0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
1a700 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1a710 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
1a720 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
1a730 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
1a740 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
1a750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a760 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  M_BKPT;.    goto
1a770 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a780 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
1a790 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
1a7a0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
1a7b0 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
1a7c0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
1a7d0 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
1a7e0 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
1a7f0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
1a800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a810 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
1a820 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
1a830 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
1a840 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
1a850 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
1a860 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
1a870 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
1a880 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
1a890 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
1a8a0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
1a8b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a8c0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1a8d0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1a8e0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1a8f0 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
1a900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a910 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
1a920 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
1a930 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
1a940 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
1a950 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
1a960 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
1a970 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a980 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
1a990 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
1a9a0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
1a9b0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
1a9c0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
1a9d0 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
1a9e0 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
1a9f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1aa00 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
1aa10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
1aa20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
1aa30 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
1aa40 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
1aa50 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1aa60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1aa70 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1aa80 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
1aa90 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
1aaa0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1aab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aac0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1aad0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1aae0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1aaf0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
1ab00 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
1ab10 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
1ab20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
1ab30 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
1ab40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1ab50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ab60 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1ab70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1ab80 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
1ab90 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
1aba0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
1abb0 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
1abc0 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
1abd0 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
1abe0 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
1abf0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1ac00 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1ac10 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
1ac20 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1ac30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ac40 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
1ac50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ac60 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
1ac70 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
1ac80 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
1ac90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1aca0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
1acb0 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
1acc0 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
1acd0 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
1ace0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
1acf0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
1ad00 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
1ad10 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
1ad20 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
1ad30 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
1ad40 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
1ad50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ad60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1ad70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1ad80 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
1ad90 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
1ada0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
1adb0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
1adc0 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
1add0 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
1ade0 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
1adf0 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
1ae00 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1ae10 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
1ae20 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
1ae30 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
1ae40 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1ae50 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1ae60 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
1ae70 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
1ae80 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
1ae90 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
1aea0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
1aeb0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1aec0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1aed0 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
1aee0 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
1aef0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
1af00 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
1af10 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
1af20 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1af30 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
1af40 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
1af50 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
1af60 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
1af70 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
1af80 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
1af90 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
1afa0 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1afb0 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
1afc0 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
1afd0 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
1afe0 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
1aff0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1b000 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
1b010 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
1b020 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
1b030 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
1b040 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
1b050 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
1b060 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
1b070 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
1b080 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
1b090 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
1b0a0 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
1b0b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b0c0 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
1b0d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1b0e0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
1b0f0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1b100 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1b110 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
1b120 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1b130 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
1b140 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
1b150 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1b160 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
1b170 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
1b180 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1b190 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1b1a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1b1b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1b1c0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
1b1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b1e0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1b1f0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
1b200 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1b210 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
1b220 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1b230 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1b240 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1b250 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1b260 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
1b270 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
1b280 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
1b290 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
1b2a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
1b2b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1b2c0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1b2d0 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  CK );.    /* TOD
1b2e0 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
1b2f0 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
1b300 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
1b310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b320 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1b330 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
1b340 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
1b350 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e   = szPage*(i64)n
1b360 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
1b370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1b380 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
1b390 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
1b3a0 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
1b3b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1b3c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
1b3d0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
1b3e0 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
1b3f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75     }else if( (cu
1b400 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65  rrentSize+szPage
1b410 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  )<=newSize ){.  
1b420 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70        char *pTmp
1b430 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1b440 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65  pace;.        me
1b450 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a  mset(pTmp, 0, sz
1b460 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Page);.        t
1b470 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
1b480 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72  e-szPage) == cur
1b490 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
1b4a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
1b4b0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e  ewSize-szPage) >
1b4c0 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
1b4d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b4e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1b4f0 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73  ger->fd, pTmp, s
1b500 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73  zPage, newSize-s
1b510 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zPage);.      }.
1b520 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b540 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1b550 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1b560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b570 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b580 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1b590 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f  sanitized versio
1b5a0 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d  n of the sector-
1b5b0 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20  size of OS file 
1b5c0 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65  pFile. The.** re
1b5d0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75  turn value is gu
1b5e0 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20  aranteed to lie 
1b5f0 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d  between 32 and M
1b600 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1b610 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1b620 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1b630 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1b640 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69   int iRet = sqli
1b650 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
1b660 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52  pFile);.  if( iR
1b670 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65  et<32 ){.    iRe
1b680 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  t = 512;.  }else
1b690 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45   if( iRet>MAX_SE
1b6a0 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
1b6b0 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
1b6c0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
1b6d0 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f  .    iRet = MAX_
1b6e0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1b6f0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a  .  return iRet;.
1b700 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1b710 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
1b720 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1b730 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
1b740 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
1b750 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
1b760 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1b770 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
1b780 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
1b790 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1b7a0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
1b7b0 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
1b7c0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
1b7d0 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
1b7e0 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
1b7f0 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
1b800 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1b810 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
1b820 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
1b830 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
1b840 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1b850 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1b860 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
1b870 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
1b880 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1b890 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
1b8a0 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
1b8b0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b8c0 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
1b8d0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b8e0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1b8f0 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
1b900 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
1b910 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1b920 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
1b930 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
1b940 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
1b950 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b960 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1b980 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49  ile has the SQLI
1b990 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1b9a0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f  FE_OVERWRITE pro
1b9b0 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a  perty, then set.
1b9c0 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ** the effective
1b9d0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20   sector size to 
1b9e0 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  its minimum valu
1b9f0 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75  e (512).  The pu
1ba00 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67  rpose of.** pPag
1ba10 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  er->sectorSize i
1ba20 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20  s to define the 
1ba30 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f  "blast radius" o
1ba40 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20  f bytes that.** 
1ba50 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20  might change if 
1ba60 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  a crash occurs w
1ba70 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
1ba80 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1ba90 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20  .** that range. 
1baa0 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53   But with POWERS
1bab0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74  AFE_OVERWRITE, t
1bac0 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20  he blast radius 
1bad0 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74  is zero.** (that
1bae0 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41   is what POWERSA
1baf0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61  FE_OVERWRITE mea
1bb00 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d  ns), so we minim
1bb10 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a  ize the sector.*
1bb20 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63  * size.  For bac
1bb30 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1bb40 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c  lity of the roll
1bb50 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
1bb60 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20  e format,.** we 
1bb70 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68  cannot reduce th
1bb80 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1bb90 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31  or size below 51
1bba0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1bbb0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
1bbc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1bbd0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1bbe0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1bbf0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1bc00 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1bc10 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c  r->tempFile.   |
1bc20 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
1bc30 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1bc40 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20  s(pPager->fd) & 
1bc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1bc60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1bc70 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1bc80 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1bc90 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
1bca0 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
1bcb0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1bcc0 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
1bcd0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
1bce0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
1bcf0 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
1bd00 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
1bd10 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
1bd20 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20   will segfault. 
1bd30 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
1bd40 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
1bd50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1bd60 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1bd70 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72   = sqlite3Sector
1bd80 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
1bd90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
1bda0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
1bdb0 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
1bdc0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
1bdd0 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
1bde0 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1bdf0 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
1be00 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
1be10 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
1be20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1be30 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
1be40 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
1be50 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
1be60 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
1be70 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
1be80 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1be90 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1bea0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1beb0 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
1bec0 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
1bed0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1bee0 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
1bef0 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1bf00 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
1bf10 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
1bf20 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
1bf30 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1bf40 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
1bf50 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1bf60 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1bf70 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
1bf80 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
1bf90 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
1bfa0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
1bfb0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
1bfc0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1bfd0 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
1bfe0 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
1bff0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
1c000 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1c010 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
1c020 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1c030 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1c040 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
1c050 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
1c060 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
1c070 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
1c080 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
1c090 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1c0a0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1c0b0 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
1c0c0 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
1c0d0 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
1c0e0 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
1c0f0 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
1c100 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
1c110 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
1c120 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
1c130 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
1c140 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
1c150 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
1c160 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1c170 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
1c180 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
1c190 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
1c1a0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
1c1b0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
1c1c0 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
1c1d0 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
1c1e0 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
1c1f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
1c200 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1c210 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
1c220 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
1c230 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
1c240 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
1c250 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
1c260 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
1c270 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
1c280 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
1c290 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
1c2a0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1c2b0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1c2c0 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1c2d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1c2e0 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1c2f0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1c300 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1c310 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1c320 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1c330 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1c340 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1c350 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1c360 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1c370 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1c380 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1c390 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1c3a0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1c3b0 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1c3c0 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1c3d0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1c3e0 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1c3f0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1c400 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1c410 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1c420 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1c430 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1c440 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1c450 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1c460 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1c470 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1c480 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1c490 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1c4a0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1c4b0 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1c4c0 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1c4d0 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1c4e0 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1c4f0 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1c500 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1c510 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1c520 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1c530 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1c540 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1c550 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1c560 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1c570 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1c580 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1c590 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1c5a0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1c5b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1c5c0 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1c5d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1c5e0 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1c5f0 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1c600 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1c610 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1c620 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1c630 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1c640 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1c650 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1c660 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1c670 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1c680 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1c690 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1c6a0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1c6b0 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1c6c0 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1c6d0 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1c6e0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1c6f0 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1c700 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1c710 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1c720 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1c730 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1c740 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1c750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1c760 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1c770 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1c780 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1c790 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1c7a0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1c7b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1c7c0 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1c7d0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1c7e0 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1c7f0 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1c800 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1c810 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1c820 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1c830 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1c840 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1c850 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1c860 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1c870 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1c880 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1c890 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1c8a0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1c8b0 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1c8c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1c8d0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1c8e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1c8f0 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1c900 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1c910 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1c920 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1c930 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c940 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c950 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1c960 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1c970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c980 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1c990 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c9a0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c9c0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1c9d0 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1c9e0 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1c9f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1ca00 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1ca10 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1ca20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1ca30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1ca40 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1ca50 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1ca60 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1ca70 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1ca80 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1ca90 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1caa0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1cab0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1cac0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1cad0 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1cae0 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1caf0 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1cb00 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1cb10 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1cb20 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1cb30 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61  */.  int nPlayba
1cb40 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
1cb50 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1cb60 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20   pages restored 
1cb70 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
1cb80 20 20 75 33 32 20 73 61 76 65 64 50 61 67 65 53    u32 savedPageS
1cb90 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
1cba0 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69  geSize;..  /* Fi
1cbb0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1cbc0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1cbd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1cbe0 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1cbf0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1cc00 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1cc10 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1cc20 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1cc30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1cc40 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1cc50 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1cc60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cc70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1cc80 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1cc90 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1cca0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1ccb0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1ccc0 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1ccd0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1cce0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1ccf0 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1cd00 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1cd10 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1cd20 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1cd30 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1cd40 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1cd50 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1cd60 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1cd70 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1cd80 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1cd90 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1cda0 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1cdb0 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1cdc0 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1cdd0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1cde0 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1cdf0 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1ce00 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1ce10 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1ce20 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1ce30 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1ce40 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1ce50 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68  x.c,.  ** mxPath
1ce60 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1ce70 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1ce80 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1ce90 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1cea0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1ceb0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1cec0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1ced0 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1cee0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1cef0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1cf00 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1cf10 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1cf20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cf30 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1cf40 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1cf50 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1cf60 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1cf70 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1cf80 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1cf90 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1cfa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cfb0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1cfc0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1cfd0 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1cfe0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1cff0 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1d000 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1d010 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1d020 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1d030 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1d040 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1d050 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1d060 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1d070 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1d080 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1d090 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1d0a0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1d0b0 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1d0c0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1d0d0 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1d0e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1d0f0 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1d100 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1d110 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1d120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1d130 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1d140 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1d150 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1d160 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1d170 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1d180 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1d190 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1d1a0 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1d1b0 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1d1c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1d1d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1d1e0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1d1f0 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1d200 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1d210 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d220 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1d230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1d240 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1d250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d260 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1d270 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1d280 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1d290 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1d2a0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1d2b0 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1d2c0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1d2d0 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1d2e0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1d2f0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1d300 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1d310 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1d320 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1d330 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1d340 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1d350 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1d360 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1d370 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1d380 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1d390 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1d3a0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1d3b0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1d3c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1d3d0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1d3e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1d3f0 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1d400 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1d410 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1d420 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1d430 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1d440 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1d450 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1d460 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1d470 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1d480 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1d490 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1d4a0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1d4b0 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1d4c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1d4d0 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1d4e0 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1d4f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1d500 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1d510 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1d520 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1d530 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1d540 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1d550 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1d560 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1d570 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1d580 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1d590 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1d5a0 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1d5b0 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1d5c0 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1d5d0 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1d5e0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1d5f0 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1d600 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1d610 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1d620 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1d630 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1d640 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1d650 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1d660 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1d670 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1d680 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1d690 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1d6a0 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1d6b0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1d6c0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1d6d0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1d6e0 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1d6f0 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1d700 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1d710 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1d720 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1d730 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1d740 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1d750 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1d760 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1d770 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1d780 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1d790 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1d7a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d7b0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1d7c0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1d7d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1d7e0 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1d7f0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1d800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1d810 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1d820 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1d830 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1d840 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1d850 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1d860 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1d870 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1d880 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1d890 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1d8a0 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1d8b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1d8c0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1d8d0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d8e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1d8f0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1d900 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1d910 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d930 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d940 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1d950 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d960 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1d970 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1d980 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1d990 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1d9a0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1d9b0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d9c0 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1d9d0 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1d9e0 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1d9f0 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1da00 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1da10 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1da20 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1da30 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1da40 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1da50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1da60 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1da70 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1da80 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1da90 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1daa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1dac0 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1dad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1daf0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1db00 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1db10 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1db20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1db30 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1db40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1db50 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1db60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1db70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1db80 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1db90 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1dba0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1dbb0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1dbc0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1dbd0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1dbe0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1dbf0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1dc00 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1dc10 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1dc20 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1dc30 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1dc40 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1dc50 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1dc60 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1dc70 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1dc80 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1dc90 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1dca0 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1dcb0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1dcc0 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1dcd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dce0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1dcf0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1dd00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1dd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1dd20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1dd30 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1dd40 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1dd50 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1dd60 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1dd70 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1dd80 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1dd90 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1dda0 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1ddb0 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1ddc0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1ddd0 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1dde0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1ddf0 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1de00 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1de10 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1de20 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1de30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1de40 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1de50 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1de60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1de70 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1de80 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1de90 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1dea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1deb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1dec0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1ded0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
1dee0 26 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20  &savedPageSize, 
1def0 2d 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f  -1);.  }.  /* Fo
1df00 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
1df10 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
1df20 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1df30 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
1df40 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
1df50 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
1df60 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
1df70 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
1df80 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
1df90 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1dfa0 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
1dfb0 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
1dfc0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
1dfd0 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
1dfe0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1dff0 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
1e000 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1e010 49 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69  ITE_DEBUG.  sqli
1e020 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1e030 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
1e040 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1e050 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 23 65  UNCHANGED,0);.#e
1e060 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1e070 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1e080 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1e090 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1e0a0 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1e0b0 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1e0c0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1e0d0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1e0e0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1e0f0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1e100 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1e110 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1e120 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1e130 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1e140 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1e150 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1e160 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1e170 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1e180 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1e190 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1e1a0 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1e1b0 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1e1c0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1e1d0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1e1e0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1e1f0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1e200 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1e210 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1e220 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1e230 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1e240 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1e250 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1e260 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1e270 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1e280 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1e290 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1e2a0 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1e2b0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1e2c0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1e2d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1e2e0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1e2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1e300 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1e310 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1e320 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1e330 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1e340 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1e350 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1e360 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1e370 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1e380 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1e390 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e3a0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1e3b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1e3c0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1e3d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1e3e0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1e3f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e400 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c  agerSync(pPager,
1e410 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
1e420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e430 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1e440 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1e450 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1e460 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20  ]!='\0', 0);.   
1e470 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1e480 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1e490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e4a0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1e4b0 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1e4c0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1e4d0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1e4e0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1e4f0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1e500 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1e510 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1e520 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1e530 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1e540 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1e550 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1e560 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1e570 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1e580 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e590 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48  );.  }.  if( isH
1e5a0 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20  ot && nPlayback 
1e5b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
1e5c0 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
1e5d0 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
1e5e0 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64  K, "recovered %d
1e5f0 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c   pages from %s",
1e600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e610 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67   nPlayback, pPag
1e620 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
1e630 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1e640 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1e650 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1e660 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1e670 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1e680 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1e690 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1e6a0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1e6b0 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1e6c0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1e6d0 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1e6e0 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1e6f0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1e700 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1e710 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1e720 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1e730 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1e740 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1e750 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1e760 61 73 65 20 66 69 6c 65 20 28 6f 72 20 6f 75 74  ase file (or out
1e770 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41 4c 20 69   of.** the WAL i
1e780 66 20 74 68 61 74 20 69 73 20 77 68 65 72 65 20  f that is where 
1e790 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1e7a0 63 6f 70 79 20 69 66 20 66 6f 75 6e 64 29 20 69  copy if found) i
1e7b0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
1e7c0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
1e7d0 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
1e7e0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
1e7f0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1e800 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
1e810 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e820 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1e830 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
1e840 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
1e850 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
1e860 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
1e870 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
1e880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e890 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
1e8a0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
1e8b0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1e8c0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
1e8d0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
1e8e0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e8f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e900 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e910 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
1e920 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
1e930 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1e940 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
1e950 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1e960 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
1e970 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1e980 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1e990 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e9a0 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
1e9b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1e9c0 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20  u32 iFrame = 0; 
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e9e0 46 72 61 6d 65 20 6f 66 20 57 41 4c 20 63 6f 6e  Frame of WAL con
1e9f0 74 61 69 6e 69 6e 67 20 70 67 6e 6f 20 2a 2f 0a  taining pgno */.
1ea00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ea10 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1ea20 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1ea30 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1ea40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1ea50 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65  ) );..  if( page
1ea60 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1ea70 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ea80 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
1ea90 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
1eaa0 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  g->pgno, &iFrame
1eab0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1eac0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1ead0 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1eae0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1eaf0 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67  alReadFrame(pPag
1eb00 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65  er->pWal, iFrame
1eb10 2c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  ,pPager->pageSiz
1eb20 65 2c 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e,pPg->pData);. 
1eb30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1eb40 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1eb50 74 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  t = (pPg->pgno-1
1eb60 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1eb70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1eb80 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1eb90 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1eba0 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  >pData, pPager->
1ebb0 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65  pageSize, iOffse
1ebc0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1ebd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1ebe0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1ebf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ec00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1ec10 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  ( pPg->pgno==1 )
1ec20 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1ec30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1ec40 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1ec50 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1ec60 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1ec70 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1ec80 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1ec90 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1eca0 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1ecb0 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1ecc0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1ecd0 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1ece0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1ecf0 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1ed00 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1ed10 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1ed20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1ed30 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1ed40 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1ed50 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1ed60 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1ed70 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1ed80 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1ed90 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1eda0 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1edb0 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1edc0 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1edd0 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1ede0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1edf0 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1ee00 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1ee10 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1ee20 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1ee30 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1ee40 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1ee50 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1ee60 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1ee70 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1ee80 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65    ** white noise
1ee90 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1eea0 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1eeb0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1eec0 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1eed0 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1eee0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1eef0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1ef00 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1ef10 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1ef20 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1ef30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ef40 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1ef50 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1ef60 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1ef70 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1ef80 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1ef90 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1efa0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1efb0 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1efc0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1efd0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d  pPg->pData, pPg-
1efe0 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53  >pgno, 3, rc = S
1eff0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1f000 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1f010 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1f020 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1f030 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1f040 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1f050 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1f060 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1f070 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  g->pgno));.  PAG
1f080 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1f090 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1f0a0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1f0b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1f0c0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1f0d0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1f0e0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1f0f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f100 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61  ** Update the va
1f110 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1f120 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66  e-counter at off
1f130 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69  sets 24 and 92 i
1f140 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  n.** the header 
1f150 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76  and the sqlite v
1f160 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
1f170 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
1f180 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63  * This is an unc
1f190 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
1f1a0 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  e.  See also the
1f1b0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1f1c0 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72  gecounter().** r
1f1d0 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c  outine which onl
1f1e0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1f1f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20  ange-counter if 
1f200 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63  the update is ac
1f210 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64  tually.** needed
1f220 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20  , as determined 
1f230 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  by the pPager->c
1f240 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73  hangeCountDone s
1f250 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  tate variable..*
1f260 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
1f270 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1f280 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70  counter(PgHdr *p
1f290 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67  Pg){.  u32 chang
1f2a0 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a  e_counter;..  /*
1f2b0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1f2c0 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1f2d0 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1f2e0 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1f2f0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1f300 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1f310 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61  te((u8*)pPg->pPa
1f320 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1f330 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  +1;.  put32bits(
1f340 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1f350 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1f360 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41  ounter);..  /* A
1f370 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
1f380 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
1f390 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
1f3a0 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20  .99 and in.  ** 
1f3b0 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
1f3c0 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
1f3d0 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
1f3e0 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
1f3f0 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64  er.  ** is valid
1f400 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
1f410 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1f420 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
1f430 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33  counter);.  put3
1f440 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1f450 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  g->pData)+96, SQ
1f460 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1f470 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  BER);.}..#ifndef
1f480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1f490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f4a0 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1f4b0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1f4c0 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1f4d0 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1f4e0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1f4f0 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1f500 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1f510 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1f520 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1f530 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1f540 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1f550 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1f560 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1f570 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1f580 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1f590 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1f5a0 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1f5b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1f5c0 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1f5d0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1f5e0 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1f5f0 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1f600 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1f610 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1f620 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1f630 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1f640 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1f650 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1f660 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1f670 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1f680 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1f690 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1f6a0 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1f6b0 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1f6c0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1f6d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1f6e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1f6f0 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1f700 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1f710 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1f720 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f730 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1f740 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1f750 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1f760 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
1f770 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f780 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73  er) );.  pPg = s
1f790 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1f7a0 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a  p(pPager, iPg);.
1f7b0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
1f7c0 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
1f7d0 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
1f7e0 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Pg)==1 ){.      
1f7f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
1f800 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  p(pPg);.    }els
1f810 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  e{.      rc = re
1f820 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
1f830 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f850 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1f860 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1f870 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1f880 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1f890 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1f8a0 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1f8b0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1f8c0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1f8d0 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1f8e0 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1f8f0 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1f900 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1f910 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1f920 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1f930 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1f940 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1f950 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1f960 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1f970 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1f980 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1f990 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1f9a0 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1f9b0 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1f9c0 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1f9d0 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1f9e0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1f9f0 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1fa00 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1fa10 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1fa20 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1fa30 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1fa40 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1fa50 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1fa60 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1fa70 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1fa80 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1fa90 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1faa0 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1fab0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1fac0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1fad0 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1fae0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1faf0 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1fb00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fb10 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1fb20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1fb30 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1fb60 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1fb70 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1fb80 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1fb90 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1fba0 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1fbb0 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1fbc0 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1fbd0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1fbe0 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1fbf0 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1fc00 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1fc10 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1fc20 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1fc30 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1fc40 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1fc50 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1fc60 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1fc70 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1fc80 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1fc90 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1fca0 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1fcb0 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1fcc0 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1fcd0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1fce0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1fcf0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fd00 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1fd10 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1fd20 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1fd30 29 70 50 61 67 65 72 2c 0a 23 69 66 64 65 66 20  )pPager,.#ifdef 
1fd40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
1fd50 55 52 52 45 4e 54 0a 20 20 20 20 20 20 30 0a 23  URRENT.      0.#
1fd60 65 6c 73 65 0a 20 20 20 20 20 20 70 50 61 67 65  else.      pPage
1fd70 72 2d 3e 70 41 6c 6c 52 65 61 64 21 3d 30 0a 23  r->pAllRead!=0.#
1fd80 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 70 4c 69  endif.  );.  pLi
1fd90 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1fda0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1fdb0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23  er->pPCache);..#
1fdc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fdd0 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20  IT_CONCURRENT.  
1fde0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
1fdf0 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e   CONCURRENT tran
1fe00 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70 61  saction, then pa
1fe10 67 65 20 31 20 6d 75 73 74 20 62 65 20 72 65 72  ge 1 must be rer
1fe20 65 61 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 74  ead from .  ** t
1fe30 68 65 20 64 62 20 66 69 6c 65 2c 20 65 76 65 6e  he db file, even
1fe40 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 64 69   if it is not di
1fe50 72 74 79 2e 20 54 68 69 73 20 69 73 20 62 65 63  rty. This is bec
1fe60 61 75 73 65 20 74 68 65 20 62 2d 74 72 65 65 20  ause the b-tree 
1fe70 6c 61 79 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20  layer .  ** may 
1fe80 68 61 76 65 20 61 6c 72 65 61 64 79 20 7a 65 72  have already zer
1fe90 6f 65 64 20 74 68 65 20 6e 46 72 65 65 20 61 6e  oed the nFree an
1fea0 64 20 69 54 72 75 6e 6b 20 68 65 61 64 65 72 20  d iTrunk header 
1feb0 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 69 66  fields.  */.  if
1fec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fed0 26 26 20 28 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  && (pList==0 || 
1fee0 70 4c 69 73 74 2d 3e 70 67 6e 6f 21 3d 31 29 20  pList->pgno!=1) 
1fef0 26 26 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  && pPager->pAllR
1ff00 65 61 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ead ){.    rc = 
1ff10 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1ff20 6b 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c  k((void*)pPager,
1ff30 20 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   1);.  }.#endif.
1ff40 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
1ff50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1ff60 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1ff70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
1ff80 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  irty;.    rc = p
1ff90 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1ffa0 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c  ((void *)pPager,
1ffb0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1ffc0 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
1ffd0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1ffe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1fff0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
20000 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
20010 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
20020 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f  ). As well as lo
20030 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  gging.** the con
20040 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73  tents of the lis
20050 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65  t of pages heade
20060 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e  d by pList (conn
20070 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29  ected by pDirty)
20080 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
20090 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20  on notifies any 
200a0 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72  active backup pr
200b0 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65  ocesses that the
200c0 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63   pages have.** c
200d0 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  hanged. .**.** T
200e0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
200f0 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69   passed into thi
20100 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77  s routine is alw
20110 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61  ays sorted by pa
20120 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65  ge number..** He
20130 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61  nce, if page 1 a
20140 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20  ppears anywhere 
20150 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20  on the list, it 
20160 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73  will be the firs
20170 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74  t page..*/ .stat
20180 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
20190 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
201a0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
201b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
201c0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
201d0 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
201f0 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
20200 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
20210 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
20220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
20230 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
20240 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
20250 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20270 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
20280 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
20290 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
202c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
202d0 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  nList;          
202e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
202f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
20300 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48  n pList */.  PgH
20310 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20330 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
20340 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73   pages */..  ass
20350 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
20360 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
20370 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53  List );.#ifdef S
20380 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
20390 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
203a0 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e   page list is in
203b0 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
203c0 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73   */.  for(p=pLis
203d0 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74  t; p && p->pDirt
203e0 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  y; p=p->pDirty){
203f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
20400 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79  pgno < p->pDirty
20410 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65  ->pgno );.  }.#e
20420 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
20430 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
20440 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   || isCommit );.
20450 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29    if( isCommit )
20460 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41  {.    /* If a WA
20470 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
20480 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
20490 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  , there is no po
204a0 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20  int in writing. 
204b0 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20     ** any pages 
204c0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
204d0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
204e0 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68  Truncate into th
204f0 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20  e WAL file..    
20500 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76  ** They will nev
20510 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e  er be read by an
20520 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d  y client. So rem
20530 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
20540 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20  e pDirty.    ** 
20550 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20  list here. */.  
20560 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
20570 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
20580 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
20590 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
205a0 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
205b0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
205c0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
205d0 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
205e0 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
205f0 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
20600 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20  nList++;.       
20610 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 4f   PAGERTRACE(("TO
20620 2d 57 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  -WAL %d page %d 
20630 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
20660 65 72 29 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 61  er), p->pgno, pa
20670 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 29 29  ger_pagehash(p))
20680 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20690 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
206a0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
206b0 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
206c0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
206d0 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
206e0 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
206f0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
20700 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
20710 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
20720 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
20730 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
20740 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
20750 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
20760 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
20770 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
20780 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
20790 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
207a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
207b0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
207c0 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  kup ){.    for(p
207d0 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
207e0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73  pDirty){.      s
207f0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
20800 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
20810 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38  up, p->pgno, (u8
20820 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20   *)p->pData);.  
20830 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
20840 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
20850 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  ES.  pList = sql
20860 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
20870 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
20880 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c  che);.  for(p=pL
20890 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
208a0 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  rty){.    pager_
208b0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b  set_pagehash(p);
208c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
208d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
208e0 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
208f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
20900 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
20910 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
20920 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
20930 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
20940 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
20950 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
20960 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
20970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
20980 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
20990 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
209a0 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
209b0 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
209c0 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
209d0 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
209e0 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
209f0 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
20a00 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
20a10 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
20a20 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
20a30 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
20a40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20a50 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
20a80 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
20a90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20aa0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20ab0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
20ac0 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
20ad0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
20ae0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
20af0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20b00 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
20b10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20b20 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
20b30 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61  ..  /* sqlite3Wa
20b40 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
20b50 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ion() was not ca
20b60 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65  lled for the pre
20b70 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73  vious.  ** trans
20b80 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e  action in lockin
20b90 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
20ba0 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f  .  So call it no
20bb0 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61  w.  If we.  ** a
20bc0 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  re in locking_mo
20bd0 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e  de=NORMAL and En
20be0 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76  dRead() was prev
20bf0 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20  iously called,. 
20c00 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74   ** the duplicat
20c10 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65  e call is harmle
20c20 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
20c30 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
20c40 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
20c50 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pWal);..  rc = s
20c60 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65  qlite3WalBeginRe
20c70 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
20c80 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61  ager->pWal, &cha
20c90 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21  nged);.  if( rc!
20ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68  =SQLITE_OK || ch
20cb0 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67  anged ){.    pag
20cc0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
20cd0 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
20ce0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
20cf0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
20d00 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
20d10 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20d20 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
20d30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20d40 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
20d50 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
20d60 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
20d70 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
20d80 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
20d90 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
20da0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20db0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
20dc0 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
20dd0 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
20de0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
20df0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
20e00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
20e10 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
20e20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20e30 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
20e40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
20e50 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
20e60 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
20e70 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
20e80 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
20e90 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
20ea0 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
20eb0 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
20ec0 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
20ed0 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
20ee0 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
20ef0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
20f00 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
20f10 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
20f40 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
20f50 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
20f60 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
20f70 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
20f80 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
20f90 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
20fa0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
20fb0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
20fc0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
20fd0 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
20fe0 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
20ff0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
21000 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
21010 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
21020 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
21030 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
21040 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
21050 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
21060 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
21070 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
21080 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
21090 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
210a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
210b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
210c0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
210d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
210e0 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
210f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
21100 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
21110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21120 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
21130 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
21140 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
21150 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
21160 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  /* If the number
21170 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
21180 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
21190 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
211a0 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62  the.  ** WAL sub
211b0 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69  -system, determi
211c0 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e  ne the page coun
211d0 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
211e0 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ize of.  ** the 
211f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
21200 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  If the size of t
21210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21220 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20   is not an.  ** 
21230 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
21240 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
21250 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20  e, round up the 
21260 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
21270 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41  f( nPage==0 && A
21280 4c 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61  LWAYS(isOpen(pPa
21290 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20  ger->fd)) ){.   
212a0 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
212c0 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
212d0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
212e0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
212f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
21300 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
21310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21320 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
21330 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
21340 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29    nPage = (Pgno)
21350 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  ((n+pPager->page
21360 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72  Size-1) / pPager
21370 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
21380 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
21390 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
213a0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
213b0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
213c0 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  n the.  ** confi
213d0 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
213e0 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
213f0 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
21400 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
21410 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
21420 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
21430 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
21440 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
21450 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
21460 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
21470 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   }..  *pnPage = 
21480 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
21490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
214a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
214b0 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63  T_WAL./*.** Chec
214c0 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
214d0 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
214e0 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
214f0 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
21500 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20  Pager.** exists 
21510 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
21520 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20  is not empy, or 
21530 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
21540 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  *-wal file does.
21550 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79  ** not exist (by
21560 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66   deleting it) if
21570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21580 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
21590 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
215a0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  se is not empty 
215b0 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  and the *-wal fi
215c0 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20  le exists, open 
215d0 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20  the pager.** in 
215e0 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68  WAL mode.  If th
215f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
21600 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77  pty or if no *-w
21610 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
21620 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f  nd.** if no erro
21630 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73  r occurs, make s
21640 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ure Pager.journa
21650 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74  lMode is not set
21660 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55   to.** PAGER_JOU
21670 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a  RNALMODE_WAL..**
21680 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
21690 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72  E_OK or an error
216a0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
216b0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c   caller must hol
216c0 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  d a SHARED lock 
216d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
216e0 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  file to call thi
216f0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42  s.** function. B
21700 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53  ecause an EXCLUS
21710 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
21720 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  db file is requi
21730 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a  red to delete .*
21740 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e  * a WAL on a non
21750 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  e-empty database
21760 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
21770 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
21780 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65  condition .** be
21790 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73  tween the xAcces
217a0 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  s() below and an
217b0 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
217c0 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
217d0 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e  e .** other conn
217e0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
217f0 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57  c int pagerOpenW
21800 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65  alIfPresent(Page
21810 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21820 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21840 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
21850 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
21860 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
21870 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
21880 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
21890 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
218a0 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66  /* True if WAL f
218d0 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
218e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
218f0 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
21900 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
21910 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
21920 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
21930 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a  , &isWal.    );.
21940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
21960 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
21970 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
219a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
219b0 2f 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  /..        rc = 
219c0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
219d0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
219e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
219f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21a00 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
21a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
21a20 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
21a30 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
21a40 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
21a50 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21a60 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
21a70 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
21a80 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
21a90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
21aa0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
21ab0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
21ac0 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
21ad0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21ae0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
21af0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
21b00 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
21b10 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
21b20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21b30 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
21b40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
21b50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
21b60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21b70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
21b80 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
21b90 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
21ba0 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
21bb0 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
21bc0 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
21bd0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
21be0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
21bf0 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
21c00 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
21c10 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
21c20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
21c30 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
21c40 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
21c50 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
21c60 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
21c70 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
21c80 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
21c90 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
21ca0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
21cb0 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
21cc0 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
21cd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
21ce0 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
21cf0 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
21d00 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
21d10 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
21d20 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
21d30 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
21d40 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
21d50 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
21d60 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
21d70 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
21d80 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
21d90 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
21da0 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
21db0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
21dc0 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
21dd0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
21de0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
21df0 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
21e00 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
21e10 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
21e20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
21e30 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
21e40 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
21e50 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
21e60 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
21e70 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
21e80 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
21e90 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
21ea0 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
21eb0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
21ec0 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
21ed0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
21ee0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
21ef0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
21f00 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
21f10 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
21f20 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
21f30 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
21f40 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
21f50 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
21f60 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
21f70 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
21f80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21f90 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
21fa0 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
21fb0 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
21fc0 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
21fd0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
21fe0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
21ff0 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
22000 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
22010 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
22020 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
22030 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
22040 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
22050 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
22060 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
22070 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
22080 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
22090 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
220a0 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
220b0 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
220c0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
220d0 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
220e0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
220f0 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
22100 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
22110 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
22120 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
22130 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
22140 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
22150 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
22160 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
22170 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
22180 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
22190 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
221a0 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
221b0 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
221c0 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
221d0 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
221e0 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
221f0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
22200 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
22210 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
22220 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
22230 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
22240 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
22250 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
22260 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
22270 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
22280 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
22290 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
222a0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
222b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
222c0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
222d0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
222e0 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22300 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
22310 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
22320 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
22330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22340 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
22350 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
22360 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
22370 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
22380 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
22390 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
223a0 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
223b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
223c0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
223d0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
223e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
223f0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
22400 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
22410 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
22420 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
22430 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
22440 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
22450 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
22460 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
22470 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
22480 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
22490 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
224a0 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
224b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
224c0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
224d0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
224e0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
224f0 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
22500 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
22510 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
22520 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
22530 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
22540 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
22550 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
22560 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
22570 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
22580 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
22590 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
225a0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
225b0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
225c0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
225d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
225e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
225f0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
22600 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
22610 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
22620 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
22630 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
22640 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
22650 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
22660 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
22670 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
22680 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
22690 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
226a0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
226b0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
226c0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
226d0 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
226e0 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
226f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
22700 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
22710 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
22720 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
22730 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
22740 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
22750 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
22760 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
22770 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
22780 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
22790 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
227a0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
227b0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
227c0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
227d0 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
227e0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
227f0 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
22800 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
22810 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
22820 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
22830 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
22840 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22850 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
22860 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
22870 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
22880 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
22890 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
228a0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
228b0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
228c0 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
228d0 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
228e0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
228f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
22900 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
22910 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
22920 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
22930 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
22940 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
22950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22960 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
22970 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
22980 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
22990 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
229a0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
229b0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
229c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
229d0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
229e0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
229f0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
22a00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22a10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22a20 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
22a30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
22a40 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
22a50 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
22a60 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
22a70 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
22a80 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
22a90 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
22aa0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
22ab0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
22ac0 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
22ad0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
22ae0 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
22af0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
22b00 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
22b10 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
22b20 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
22b30 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
22b40 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
22b50 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
22b60 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
22b70 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
22b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
22b90 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22bb0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
22bc0 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
22bd0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
22be0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
22bf0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
22c00 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
22c10 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
22c20 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
22c30 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
22c40 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22c50 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
22c60 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
22c70 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
22c80 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
22c90 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
22ca0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
22cb0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
22cc0 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
22cd0 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
22ce0 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
22cf0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
22d00 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
22d10 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
22d20 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
22d30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
22d40 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
22d50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22d60 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
22d70 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
22d80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
22d90 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
22da0 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
22db0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22dc0 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
22dd0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
22de0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
22df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22e00 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
22e10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22e20 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
22e30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
22e40 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
22e50 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
22e60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
22e70 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
22e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
22e90 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
22ea0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
22eb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
22ec0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22ed0 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
22ee0 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
22ef0 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
22f00 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
22f10 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
22f20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
22f30 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
22f40 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
22f50 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
22f60 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
22f70 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
22f80 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
22f90 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
22fa0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
22fb0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
22fc0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
22fd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22fe0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
22ff0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
23000 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  )pSavepoint->iSu
23010 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
23020 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
23030 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
23040 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
23050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
23060 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50  SavepointUndo(pP
23070 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76  ager->pWal, pSav
23080 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61  epoint->aWalData
23090 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
230a0 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
230b0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
230c0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
230d0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
230e0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
230f0 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29  t( offset==(i64)
23100 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
23110 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
23120 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
23130 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
23140 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
23150 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
23160 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
23170 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
23180 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
23190 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
231a0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
231b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
231c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
231d0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
231e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
231f0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
23200 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
23210 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
23220 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
23230 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74  wed.** before at
23240 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79  tempting to recy
23250 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e  cle clean and un
23260 75 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76  used pages..*/.v
23270 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23280 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
23290 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
232a0 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
232b0 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
232c0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
232d0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
232e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
232f0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
23300 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
23310 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
23320 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  lowed.** before 
23330 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70  attempting to sp
23340 69 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75  ill pages to jou
23350 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
23360 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c  ite3PagerSetSpil
23370 6c 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  lsize(Pager *pPa
23380 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
23390 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
233a0 65 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c  e3PcacheSetSpill
233b0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
233c0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
233d0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53  ../*.** Invoke S
233e0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
233f0 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74  _SIZE based on t
23400 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
23410 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73   of szMmap..*/.s
23420 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
23430 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65  FixMaplimit(Page
23440 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20  r *pPager){.#if 
23450 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
23460 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33  SIZE>0.  sqlite3
23470 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
23480 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73  er->fd;.  if( is
23490 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e  Open(fd) && fd->
234a0 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
234b0 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c  on>=3 ){.    sql
234c0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20  ite3_int64 sz;. 
234d0 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e     sz = pPager->
234e0 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67  szMmap;.    pPag
234f0 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20  er->bUseFetch = 
23500 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47  (sz>0);.    setG
23510 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67  etterMethod(pPag
23520 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
23530 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
23540 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
23550 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
23560 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a  SIZE, &sz);.  }.
23570 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
23580 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
23590 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d  um size of any m
235a0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
235b0 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
235c0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
235d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
235e0 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20  MmapLimit(Pager 
235f0 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
23600 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
23610 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70    pPager->szMmap
23620 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67   = szMmap;.  pag
23630 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
23640 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
23650 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  Free as much mem
23660 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
23670 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a  from the pager..
23680 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23690 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72  agerShrink(Pager
236a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
236b0 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b  ite3PcacheShrink
236c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
236d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
236e0 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74  st settings of t
236f0 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73  he pager to thos
23700 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
23710 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d  he pgFlags param
23720 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
23730 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61  "level" in pgFla
23740 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
23750 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73  RONOUS_MASK sets
23760 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a   the robustness.
23770 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
23780 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
23790 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f   to OS crashes o
237a0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
237b0 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20   by.** changing 
237c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
237d0 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
237e0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73  ing the journals
237f0 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66  ..** There are f
23800 6f 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  our levels:.**.*
23810 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
23820 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
23830 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
23840 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
23850 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
23860 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
23870 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
23880 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
23890 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
238a0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
238b0 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
238c0 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
238d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
238e0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
238f0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
23900 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
23910 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
23920 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
23930 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
23940 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
23950 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
23960 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
23970 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
23980 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
23990 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
239a0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
239b0 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
239c0 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
239d0 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
239e0 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
239f0 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
23a00 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
23a10 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
23a20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
23a30 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
23a40 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
23a50 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
23a60 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
23a70 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
23a80 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
23a90 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
23aa0 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
23ab0 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
23ac0 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
23ad0 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
23ae0 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
23b00 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
23b10 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
23b20 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
23b30 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
23b40 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
23b50 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
23b60 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
23b70 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
23b80 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
23b90 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
23ba0 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
23bb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23bc0 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
23bd0 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
23be0 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
23bf0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
23c00 20 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69     EXTRA     Thi
23c10 73 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65  s is like FULL e
23c20 78 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c  xcept that is al
23c30 73 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72  so syncs the dir
23c40 65 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20  ectory.**       
23c50 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74         that cont
23c60 61 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63  ains the rollbac
23c70 6b 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20  k journal after 
23c80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
23ca0 72 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64  rnal is unlinked
23cb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
23cc0 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
23cd0 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
23ce0 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
23cf0 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
23d00 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
23d10 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
23d20 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
23d30 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
23d40 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
23d50 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
23d60 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
23d70 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
23d80 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
23d90 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
23da0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
23db0 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
23dc0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
23dd0 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
23de0 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
23df0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
23e00 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
23e10 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
23e20 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
23e30 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
23e40 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
23e50 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
23e60 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
23e70 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
23e80 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
23e90 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
23ea0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
23eb0 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
23ec0 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
23ed0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
23ee0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
23ef0 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58  n FULL.** and EX
23f00 54 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65  TRA for WAL mode
23f10 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
23f20 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
23f30 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
23f40 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
23f50 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
23f60 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
23f70 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
23f80 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
23f90 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
23fa0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
23fb0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
23fc0 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
23fd0 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
23fe0 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
23ff0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
24000 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
24010 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
24020 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
24030 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
24040 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
24050 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
24060 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
24070 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
24080 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
24090 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
240a0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
240b0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
240c0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
240d0 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
240e0 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
240f0 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
24100 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
24110 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
24120 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
24130 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
24140 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
24150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
24160 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
24170 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
24180 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ags(.  Pager *pP
24190 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
241a0 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
241b0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
241c0 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
241d0 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  pgFlags      /* 
241e0 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f  Various flags */
241f0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
24200 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26  evel = pgFlags &
24210 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
24220 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70  US_MASK;.  if( p
24230 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
24240 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
24250 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  oSync = 1;.    p
24260 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
24270 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
24280 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
24290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
242a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
242b0 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43  evel==PAGER_SYNC
242c0 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30  HRONOUS_OFF ?1:0
242d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
242e0 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d  llSync = level>=
242f0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
24300 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20  S_FULL ?1:0;.   
24310 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
24320 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45  nc = level==PAGE
24330 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58  R_SYNCHRONOUS_EX
24340 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  TRA ?1:0;.  }.  
24350 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
24360 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
24370 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ->syncFlags = 0;
24380 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
24390 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c  lags & PAGER_FUL
243a0 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
243b0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
243c0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
243d0 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
243e0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
243f0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
24400 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
24410 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
24420 61 67 73 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  ags = (pPager->s
24430 79 6e 63 46 6c 61 67 73 3c 3c 32 29 3b 0a 20 20  yncFlags<<2);.  
24440 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
24450 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
24460 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
24470 20 7c 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63   |= pPager->sync
24480 46 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28  Flags;.  }.  if(
24490 20 28 70 67 46 6c 61 67 73 20 26 20 50 41 47 45   (pgFlags & PAGE
244a0 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43  R_CKPT_FULLFSYNC
244b0 29 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ) && !pPager->no
244c0 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
244d0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
244e0 20 7c 3d 20 28 53 51 4c 49 54 45 5f 53 59 4e 43   |= (SQLITE_SYNC
244f0 5f 46 55 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20  _FULL<<2);.  }. 
24500 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
24510 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20  AGER_CACHESPILL 
24520 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
24530 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
24540 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
24550 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
24560 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
24570 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
24580 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
24590 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
245a0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
245b0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
245c0 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
245d0 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
245e0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
245f0 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
24600 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
24610 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
24620 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
24630 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
24640 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
24650 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
24660 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
24670 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
24680 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
24690 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
246a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
246b0 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
246c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
246d0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
246e0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
246f0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
24700 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
24710 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
24720 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
24730 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
24740 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
24750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
24760 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
24770 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
24780 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
24790 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
247a0 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
247b0 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
247c0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
247d0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
247e0 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
247f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
24800 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
24810 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
24820 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
24830 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
24840 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
24850 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
24860 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
24870 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
24880 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
24890 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
248a0 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
248b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
248c0 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
248d0 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
248e0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
248f0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
24900 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
24910 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24920 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24930 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
24940 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
24950 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
24960 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
24970 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
24980 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
24990 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
249a0 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
249b0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
249c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
249d0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
249e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
249f0 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
24a00 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
24a10 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
24a20 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
24a30 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
24a40 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
24a50 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
24a60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
24a70 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
24a80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24a90 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
24aa0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
24ab0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
24ac0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
24ad0 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
24ae0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
24af0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
24b00 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
24b10 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
24b20 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
24b30 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
24b40 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
24b50 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
24b60 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
24b70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
24b80 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
24b90 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
24ba0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
24bb0 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
24bc0 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
24bd0 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
24be0 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
24bf0 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
24c00 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
24c10 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
24c20 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
24c30 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
24c40 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c60 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
24c70 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
24c80 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
24c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
24cc0 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
24cd0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
24ce0 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
24cf0 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
24d00 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
24d10 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
24d20 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
24d30 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
24d40 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
24d50 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
24d60 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
24d70 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
24d80 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
24d90 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
24da0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
24db0 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
24dc0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
24dd0 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
24de0 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
24df0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
24e00 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
24e10 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
24e20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24e30 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64  PagerSetBusyHand
24e40 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
24e50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
24e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24e70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
24e80 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
24e90 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
24ea0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24eb0 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
24ec0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
24ed0 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
24ee0 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
24ef0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
24f00 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
24f10 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20  Handler */.){.  
24f20 76 6f 69 64 20 2a 2a 61 70 3b 0a 20 20 70 50 61  void **ap;.  pPa
24f30 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
24f40 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
24f50 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
24f60 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
24f70 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 20  usyHandlerArg;. 
24f80 20 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26   ap = (void **)&
24f90 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
24fa0 64 6c 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  dler;.  assert( 
24fb0 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
24fc0 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
24fd0 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 61 73 73  Handler );.  ass
24fe0 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73  ert( ap[1]==pBus
24ff0 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20  yHandlerArg );. 
25000 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
25010 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
25020 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
25030 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20  TL_BUSYHANDLER, 
25040 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 7d 0a 0a  (void *)ap);.}..
25050 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
25060 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
25070 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
25080 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
25090 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
250a0 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
250b0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
250c0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
250d0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
250e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
250f0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
25100 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
25110 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
25120 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
25130 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
25140 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
25150 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20  QLITE_IOERR, an 
25160 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78  SQLITE_IOERR_xxx
25170 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c   sub-code or SQL
25180 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
25190 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
251a0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
251b0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
251c0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
251d0 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
251e0 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
251f0 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
25200 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
25210 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
25220 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
25230 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
25240 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
25250 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
25260 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
25270 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
25280 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
25290 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
252a0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
252b0 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
252c0 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
252d0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
252e0 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
252f0 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
25300 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
25310 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
25320 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
25330 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
25340 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
25350 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
25360 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
25370 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
25380 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
25390 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
253a0 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
253b0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
253c0 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
253d0 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
253e0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
253f0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
25400 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
25410 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
25420 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
25430 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
25440 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
25450 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
25460 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
25470 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
25480 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
25490 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
254a0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
254b0 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
254c0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
254d0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
254e0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
254f0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
25500 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
25510 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
25520 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
25530 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
25540 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
25550 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
25560 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
25570 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
25580 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
25590 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
255a0 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50  *pPager, u32 *pP
255b0 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
255c0 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
255d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
255e0 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
255f0 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66  ssible to do a f
25600 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72  ull assert_pager
25610 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61  _state() here, a
25620 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
25630 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
25640 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50  ed from within P
25650 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f  agerOpen(), befo
25660 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  re the state.  *
25670 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  * of the Pager o
25680 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61  bject is interna
25690 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
256a0 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65    **.  ** At one
256b0 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63   point this func
256c0 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e  tion returned an
256d0 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61   error if the pa
256e0 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a  ger was in .  **
256f0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
25700 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41  te. But since PA
25710 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20  GER_ERROR state 
25720 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
25730 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74    ** there is at
25740 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
25750 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
25760 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63  rence, this func
25770 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e  tion.  ** is a n
25780 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61  o-op for that ca
25790 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a  se anyhow..  */.
257a0 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20  .  u32 pageSize 
257b0 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
257c0 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
257d0 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
257e0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
257f0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
25800 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66  GE_SIZE) );.  if
25810 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
25820 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
25830 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20  bSize==0).   && 
25840 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
25850 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
25860 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26  Cache)==0 .   &&
25870 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
25880 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67  eSize!=(u32)pPag
25890 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
258a0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
258b0 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  w = NULL;       
258c0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d        /* New tem
258d0 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  p space */.    i
258e0 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20  64 nByte = 0;.. 
258f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
25900 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
25910 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
25920 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
25930 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
25940 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
25950 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
25960 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
25970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25980 20 2f 2a 20 38 20 62 79 74 65 73 20 6f 66 20 7a   /* 8 bytes of z
25990 65 72 6f 65 64 20 6f 76 65 72 72 75 6e 20 73 70  eroed overrun sp
259a0 61 63 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ace is sufficien
259b0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 2d  t so that the b-
259c0 74 72 65 65 0a 20 20 20 20 20 20 2a 20 63 65 6c  tree.      * cel
259d0 6c 20 68 65 61 64 65 72 20 70 61 72 73 65 72 20  l header parser 
259e0 77 69 6c 6c 20 6e 65 76 65 72 20 72 75 6e 20 6f  will never run o
259f0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
25a00 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  e allocation */.
25a10 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
25a20 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
25a30 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 2b  Malloc(pageSize+
25a40 38 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  8);.      if( !p
25a50 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  New ){.        r
25a60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
25a70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
25a80 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
25a90 65 74 28 70 4e 65 77 2b 70 61 67 65 53 69 7a 65  et(pNew+pageSize
25aa0 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 7d  , 0, 8);.      }
25ab0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25ad0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
25ae0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
25af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
25b00 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
25b10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
25b20 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
25b30 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
25b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25b50 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
25b60 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
25b70 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
25b80 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
25b90 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65  New;.      pPage
25ba0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
25bb0 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69  o)((nByte+pageSi
25bc0 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b  ze-1)/pageSize);
25bd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
25be0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
25bf0 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ze;.    }else{. 
25c00 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
25c10 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
25c20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
25c30 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
25c40 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
25c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25c60 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
25c70 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
25c80 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
25c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
25ca0 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
25cb0 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
25cc0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
25cd0 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
25ce0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
25cf0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
25d00 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c      pagerFixMapl
25d10 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  imit(pPager);.  
25d20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25d30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
25d40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
25d50 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
25d60 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
25d70 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
25d80 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
25d90 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
25da0 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
25db0 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
25dc0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
25dd0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
25de0 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
25df0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
25e00 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
25e10 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
25e20 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
25e30 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
25e40 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
25e50 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
25e60 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
25e70 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
25e80 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
25e90 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
25ea0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
25eb0 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
25ec0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25ed0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
25ee0 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
25ef0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
25f00 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
25f10 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
25f20 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
25f30 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
25f40 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
25f50 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
25f60 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
25f70 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
25f80 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
25f90 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
25fa0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
25fb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
25fc0 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
25fd0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
25fe0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
25ff0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
26000 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
26010 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
26020 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
26030 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
26040 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
26050 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
26060 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
26070 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
26080 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
26090 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f  R_OPEN );      /
260a0 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79  * Called only by
260b0 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a   OP_MaxPgcnt */.
260c0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61    /* assert( pPa
260d0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
260e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 2a  ger->dbSize ); *
260f0 2f 0a 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63  /.  /* OP_MaxPgc
26100 6e 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  nt ensures that 
26110 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 70 61  the parameter pa
26120 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
26130 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a  ction is not.  *
26140 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
26150 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
26160 76 61 6c 69 64 20 70 61 67 65 73 20 69 6e 20 74  valid pages in t
26170 68 65 20 64 61 74 61 62 61 73 65 2e 20 42 75 74  he database. But
26180 20 74 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20 62   this.  ** may b
26190 65 20 6c 65 73 73 20 74 68 61 6e 20 50 61 67 65  e less than Page
261a0 72 2e 64 62 53 69 7a 65 2c 20 61 6e 64 20 73 6f  r.dbSize, and so
261b0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61 62   the assert() ab
261c0 6f 76 65 20 69 73 20 6e 6f 74 20 76 61 6c 69 64  ove is not valid
261d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61   */.  return pPa
261e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
261f0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
26200 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
26210 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
26220 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
26230 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
26240 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
26250 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
26260 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
26270 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
26280 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
26290 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
262a0 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
262b0 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
262c0 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
262d0 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
262e0 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
262f0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
26300 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
26310 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
26320 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
26330 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
26340 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
26350 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
26360 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
26370 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
26380 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
26390 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
263a0 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
263b0 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
263c0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
263d0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
263e0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
263f0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
26400 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
26410 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
26420 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
26430 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
26440 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
26450 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
26460 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
26470 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
26480 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
26490 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
264a0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
264b0 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
264c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
264d0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
264e0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
264f0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
26500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
26510 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
26520 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
26530 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
26540 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
26550 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
26560 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
26570 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
26580 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
26590 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
265a0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
265b0 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
265c0 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
265d0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
265e0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
265f0 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
26600 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
26610 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
26620 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
26630 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
26640 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
26650 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
26660 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
26670 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
26680 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
26690 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
266a0 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
266b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
266c0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
266d0 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
266e0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
266f0 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
26700 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
26710 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
26720 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
26730 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
26740 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
26750 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
26760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
26770 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
26780 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
26790 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
267a0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
267b0 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  le );..  /* This
267c0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
267d0 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65   called by btree
267e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
267f0 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  er creating.  **
26800 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
26810 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f  t.  There has no
26820 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74  t been an opport
26830 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74  unity to transit
26840 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20  ion.  ** to WAL 
26850 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  mode yet..  */. 
26860 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
26870 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
26880 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
26890 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
268a0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
268b0 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
268c0 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
268d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
268e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
268f0 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
26900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
26910 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
26920 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
26930 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
26940 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26950 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26960 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62  ction may only b
26970 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  e called when a 
26980 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
26990 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74   is open on.** t
269a0 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74  he pager. It ret
269b0 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  urns the total n
269c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
269d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
269e0 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  **.** However, i
269f0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
26a00 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
26a10 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
26a20 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
26a30 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
26a40 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
26a50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26a60 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
26a70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
26a80 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61  nt *pnPage){.  a
26a90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
26aa0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
26ab0 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
26ac0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
26ad0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
26ae0 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50  NISHED );.  *pnP
26af0 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65  age = (int)pPage
26b00 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f  r->dbSize;.}.../
26b10 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
26b20 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
26b30 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
26b40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26b50 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
26b60 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
26b70 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
26b80 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
26b90 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
26ba0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
26bb0 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
26bc0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
26bd0 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
26be0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
26bf0 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
26c00 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
26c10 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
26c20 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
26c30 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
26c40 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
26c50 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
26c60 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
26c70 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
26c80 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
26c90 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
26ca0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
26cb0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
26cc0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
26cd0 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
26ce0 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
26cf0 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
26d00 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
26d10 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
26d20 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
26d30 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
26d40 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
26d50 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
26d60 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
26d70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
26d80 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
26d90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
26da0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
26db0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dd0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26de0 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  /..  /* Check th
26df0 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65  at this is eithe
26e00 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75  r a no-op (becau
26e10 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  se the requested
26e20 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61   lock is .  ** a
26e30 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72  lready held), or
26e40 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e   one of the tran
26e50 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65  sitions that the
26e60 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20   busy-handler.  
26e70 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65  ** may be invoke
26e80 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64  d during, accord
26e90 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  ing to the comme
26ea0 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71  nt above.  ** sq
26eb0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
26ec0 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f  yhandler()..  */
26ed0 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
26ee0 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74  er->eLock>=lockt
26ef0 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ype).       || (
26f00 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
26f10 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  O_LOCK && lockty
26f20 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
26f30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
26f40 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  er->eLock==RESER
26f50 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  VED_LOCK && lock
26f60 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
26f70 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f  LOCK).  );..  do
26f80 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65   {.    rc = page
26f90 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
26fa0 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68  locktype);.  }wh
26fb0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
26fc0 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
26fd0 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
26fe0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
26ff0 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72  rArg) );.  retur
27000 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
27010 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
27020 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
27030 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
27040 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
27050 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
27060 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
27070 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
27080 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
27090 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
270a0 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
270b0 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
270c0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
270d0 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
270e0 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
270f0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
27100 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
27110 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
27120 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
27130 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
27140 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
27150 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
27160 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
27170 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
27180 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
27190 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
271a0 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
271b0 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
271c0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
271d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
271e0 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
271f0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
27200 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
27210 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
27220 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
27230 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
27240 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
27250 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
27260 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
27270 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
27280 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
27290 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
272a0 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
272b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
272c0 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
272d0 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
272e0 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
272f0 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
27300 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
27310 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74  avior would be t
27320 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
27330 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74  rrent.** content
27340 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f   of the page. Ho
27350 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69  wever, since thi
27360 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
27370 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68   present in eith
27380 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  er.** the databa
27390 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  se file or the p
273a0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  ortion of the ro
273b0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
273c0 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  nd .** sub-journ
273d0 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  al rolled back t
273e0 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64  he content could
273f0 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64   not be restored
27400 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61   and the.** data
27410 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64  base image would
27420 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
27430 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65   It is therefore
27440 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20   fortunate that 
27450 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73  .** this circums
27460 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69  tance cannot ari
27470 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  se..*/.#if defin
27480 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
27490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
274a0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
274b0 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70  raintCb(PgHdr *p
274c0 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
274d0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
274e0 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72  DIRTY );.  asser
274f0 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  t( !subjRequires
27500 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67  Page(pPg) || pPg
27510 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61  ->pgno<=pPg->pPa
27520 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d  ger->dbSize );.}
27530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
27540 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
27550 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  raint(Pager *pPa
27560 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
27570 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
27580 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
27590 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  e, assertTruncat
275a0 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a  eConstraintCb);.
275b0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
275c0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
275d0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
275e0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
275f0 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
27600 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
27610 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
27620 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
27630 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
27640 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
27650 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
27660 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
27670 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
27680 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
27690 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
276a0 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
276b0 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
276c0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
276d0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
276e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
276f0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
27700 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27710 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72  is only called r
27720 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  ight before comm
27730 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
27740 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68  tion..** Once th
27750 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
27760 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
27770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
27780 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72  t either be.** r
27790 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f  olled back or co
277a0 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e  mmitted. It is n
277b0 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20  ot safe to call 
277c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
277d0 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e  d.** then contin
277e0 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ue writing to th
277f0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76  e database..*/.v
27800 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
27810 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
27820 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
27830 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
27840 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
27850 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61  ze>=nPage );.  a
27860 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
27870 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
27880 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
27890 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
278a0 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20   = nPage;..  /* 
278b0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65  At one point the
278c0 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65   code here calle
278d0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
278e0 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a  Constraint() to.
278f0 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74    ** ensure that
27900 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67   all pages being
27910 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20   truncated away 
27920 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
27930 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f  n are,.  ** if o
27940 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
27950 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20  oints are open, 
27960 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73  present in the s
27970 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a  avepoint .  ** j
27980 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74  ournal so that t
27990 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
279a0 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70  red if the savep
279b0 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20  oint is rolled. 
279c0 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69   ** back. This i
279d0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65  s no longer nece
279e0 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75  ssary as this fu
279f0 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e  nction is now on
27a00 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72  ly.  ** called r
27a10 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  ight before comm
27a20 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
27a30 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67  tion. So althoug
27a40 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  h the .  ** Page
27a50 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69  r object may sti
27a60 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76  ll have open sav
27a70 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e  epoints (Pager.n
27a80 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a  Savepoint!=0), .
27a90 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74    ** they cannot
27aa0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
27ab0 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72   So the assertTr
27ac0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
27ad0 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20  () call.  ** is 
27ae0 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63  no longer correc
27af0 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  t. */.}.../*.** 
27b00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
27b10 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61   called before a
27b20 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d  ttempting a hot-
27b30 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
27b40 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68  . It.** syncs th
27b50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
27b60 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74  o disk, then set
27b70 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  s pPager->journa
27b80 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  lHdr to the.** s
27b90 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
27ba0 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  al file so that 
27bb0 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
27bc0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  ck() routine kno
27bd0 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65  ws.** that the e
27be0 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ntire journal fi
27bf0 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
27c00 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e  ed..**.** Syncin
27c10 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
27c20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61  to disk before a
27c30 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
27c40 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65  l it back ensure
27c50 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  s .** that if a 
27c60 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63  power-failure oc
27c70 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
27c80 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72  rollback, the pr
27c90 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74  ocess that.** at
27ca0 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20  tempts rollback 
27cb0 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d  following system
27cc0 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74   recovery sees t
27cd0 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a  he same journal.
27ce0 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68  ** content as th
27cf0 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  is process..**.*
27d00 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
27d10 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c  goes as planned,
27d20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27d30 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
27d40 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  e, .** an SQLite
27d50 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
27d60 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
27d70 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50  SyncHotJournal(P
27d80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27d90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27da0 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67  _OK;.  if( !pPag
27db0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
27dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27dd0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
27de0 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
27df0 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RMAL);.  }.  if(
27e00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27e10 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
27e20 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
27e30 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
27e40 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
27e50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27e60 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
27e70 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
27e80 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65  *.** Obtain a re
27e90 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d  ference to a mem
27ea0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
27eb0 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20  object for page 
27ec0 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a  number pgno. .**
27ed0 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
27ee0 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69  will use the poi
27ef0 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61  nter pData, obta
27f00 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68  ined from xFetch
27f10 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ()..** If succes
27f20 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67  sful, set *ppPag
27f30 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
27f40 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72  e new page refer
27f50 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ence.** and retu
27f60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
27f70 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
27f80 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27f90 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  code and set.** 
27fa0 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e  *ppPage to zero.
27fb0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65  .**.** Page refe
27fc0 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20  rences obtained 
27fd0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
27fe0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
27ff0 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62  be released.** b
28000 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52  y calling pagerR
28010 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e  eleaseMapPage().
28020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
28030 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
28040 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
28050 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
28060 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
28070 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  bject */.  Pgno 
28080 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
28090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
280a0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76  ge number */.  v
280b0 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20  oid *pData,     
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
280d0 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74  * xFetch()'d dat
280e0 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  a for this page 
280f0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  */.  PgHdr **ppP
28100 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20  age             
28110 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71       /* OUT: Acq
28120 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63  uired page objec
28130 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  t */.){.  PgHdr 
28140 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
28150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
28160 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
28170 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a  to return */.  .
28180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d    if( pPager->pM
28190 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  mapFreelist ){. 
281a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
281b0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
281c0 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67  eelist;.    pPag
281d0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
281e0 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
281f0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
28200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
28210 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 3d 38 20  ager->nExtra>=8 
28220 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  );.    memset(p-
28230 3e 70 45 78 74 72 61 2c 20 30 2c 20 38 29 3b 0a  >pExtra, 0, 8);.
28240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
28250 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64  Page = p = (PgHd
28260 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r *)sqlite3Mallo
28270 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48  cZero(sizeof(PgH
28280 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  dr) + pPager->nE
28290 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70  xtra);.    if( p
282a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
282b0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
282c0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
282d0 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
282e0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
282f0 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
28300 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
28310 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  PT;.    }.    p-
28320 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20  >pExtra = (void 
28330 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e  *)&p[1];.    p->
28340 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d  flags = PGHDR_MM
28350 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  AP;.    p->nRef 
28360 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67  = 1;.    p->pPag
28370 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d  er = pPager;.  }
28380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
28390 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26  Extra==(void *)&
283a0 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  p[1] );.  assert
283b0 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b  ( p->pPage==0 );
283c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c  .  assert( p->fl
283d0 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20  ags==PGHDR_MMAP 
283e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
283f0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
28400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
28410 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e  Ref==1 );..  p->
28420 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
28430 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
28440 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
28450 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e  Out++;..  return
28460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
28470 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  ndif../*.** Rele
28480 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
28490 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50 67  to page pPg. pPg
284a0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
284b0 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a  returned by an .
284c0 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  ** earlier call 
284d0 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  to pagerAcquireM
284e0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
284f0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
28500 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48  leaseMapPage(PgH
28510 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
28520 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
28530 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65  >pPager;.  pPage
28540 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20  r->nMmapOut--;. 
28550 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
28560 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
28570 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  list;.  pPager->
28580 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20  pMmapFreelist = 
28590 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
285a0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
285b0 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  hods->iVersion>=
285c0 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  3 );.  sqlite3Os
285d0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
285e0 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70  fd, (i64)(pPg->p
285f0 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
28600 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44  ageSize, pPg->pD
28610 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ata);.}../*.** F
28620 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62  ree all PgHdr ob
28630 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20  jects stored in 
28640 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46  the Pager.pMmapF
28650 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f  reelist list..*/
28660 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
28670 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50 61  erFreeMapHdrs(Pa
28680 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28690 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64  PgHdr *p;.  PgHd
286a0 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  r *pNext;.  for(
286b0 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  p=pPager->pMmapF
286c0 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e  reelist; p; p=pN
286d0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
286e0 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
286f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
28700 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 56 65 72 69  ;.  }.}../* Veri
28710 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
28720 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
28730 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20  t be deleted or 
28740 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d  renamed out from
28750 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61  .** under the pa
28760 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ger.  Return SQL
28770 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61  ITE_OK if the da
28780 74 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20  tabase is still 
28790 77 68 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a  where it ought.*
287a0 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e  * to be on disk.
287b0 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
287c0 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  o (SQLITE_READON
287d0 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f  LY_DBMOVED or so
287e0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  me other error.*
287f0 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69  * code from sqli
28800 74 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69  te3OsAccess()) i
28810 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
28820 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e  as gone missing.
28830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
28840 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
28850 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28860 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64  .  int bHasMoved
28870 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
28880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
28890 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e  empFile ) return
288a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
288b0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
288c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
288d0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
288e0 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
288f0 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  ame && pPager->z
28900 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20  Filename[0] );. 
28910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
28920 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
28930 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
28940 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26  NTL_HAS_MOVED, &
28950 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66  bHasMoved);.  if
28960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
28970 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20  FOUND ){.    /* 
28980 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44  If the HAS_MOVED
28990 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73   file-control is
289a0 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20   unimplemented, 
289b0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
289c0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  file.    ** has 
289d0 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20  not been moved. 
289e0 20 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73   That is the his
289f0 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72  torical behavior
28a00 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f   of SQLite: prio
28a10 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73  r to.    ** vers
28a20 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65  ion 3.8.3, it ne
28a30 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20  ver checked */. 
28a40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
28a50 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  K;.  }else if( r
28a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28a70 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20  bHasMoved ){.   
28a80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
28a90 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20  DONLY_DBMOVED;. 
28aa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28ab0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  }.../*.** Shutdo
28ac0 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
28ad0 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
28ae0 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
28af0 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
28b00 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
28b10 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
28b20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
28b30 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
28b40 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
28b50 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
28b60 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
28b70 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
28b80 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
28b90 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
28ba0 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
28bb0 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
28bc0 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
28bd0 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
28be0 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
28bf0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
28c00 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
28c10 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
28c20 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
28c30 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
28c40 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
28c50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
28c60 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
28c70 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
28c80 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
28c90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
28ca0 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
28cb0 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
28cc0 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
28cd0 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
28ce0 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
28cf0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
28d00 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
28d10 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
28d20 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
28d30 61 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64  ager, sqlite3 *d
28d40 62 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  b){.  u8 *pTmp =
28d50 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54   (u8*)pPager->pT
28d60 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
28d70 74 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55 73  t( db || pagerUs
28d80 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
28d90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
28da0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28db0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73  pPager) );.  dis
28dc0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
28dd0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
28de0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
28df0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65  Malloc();.  page
28e00 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61  rFreeMapHdrs(pPa
28e10 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ger);.  /* pPage
28e20 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
28e30 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
28e40 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
28e50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28e60 4d 49 54 5f 57 41 4c 0a 20 20 7b 0a 20 20 20 20  MIT_WAL.  {.    
28e70 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 20 20 61  u8 *a = 0;.    a
28e80 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70 50 61  ssert( db || pPa
28e90 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a  ger->pWal==0 );.
28ea0 20 20 20 20 69 66 28 20 64 62 20 26 26 20 30 3d      if( db && 0=
28eb0 3d 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  =(db->flags & SQ
28ec0 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f  LITE_NoCkptOnClo
28ed0 73 65 29 20 0a 20 20 20 20 20 26 26 20 53 51 4c  se) .     && SQL
28ee0 49 54 45 5f 4f 4b 3d 3d 64 61 74 61 62 61 73 65  ITE_OK==database
28ef0 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72  IsUnmoved(pPager
28f00 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  ).    ){.      a
28f10 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20   = pTmp;.    }. 
28f20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f     sqlite3WalClo
28f30 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
28f40 20 64 62 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c   db, pPager->wal
28f50 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65  SyncFlags, pPage
28f60 72 2d 3e 70 61 67 65 53 69 7a 65 2c 61 29 3b 0a  r->pageSize,a);.
28f70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c      pPager->pWal
28f80 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
28f90 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
28fa0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
28fb0 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
28fc0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
28fd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
28fe0 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20   If it is open, 
28ff0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
29000 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
29010 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  ling UnlockAndRo
29020 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49  llback..    ** I
29030 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f  f this is not do
29040 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79  ne, then an unsy
29050 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
29060 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
29070 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61   .    ** file ma
29080 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  y be played back
29090 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
290a0 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
290b0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20  ailure occurs . 
290c0 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73     ** while this
290d0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
290e0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
290f0 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
29100 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29110 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
29120 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
29130 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  to sync the jour
29140 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70  nal, shift the p
29150 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ager.    ** into
29160 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
29170 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e  . This causes Un
29180 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20  lockAndRollback 
29190 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20  to unlock the.  
291a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e    ** database an
291b0 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  d close the jour
291c0 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74  nal file without
291d0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
291e0 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61  oll it.    ** ba
291f0 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69  ck or finalize i
29200 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61  t. The next data
29210 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68  base user will h
29220 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f  ave to do hot-jo
29230 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c  urnal.    ** rol
29240 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63  lback before acc
29250 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
29260 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
29270 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
29280 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
29290 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
292a0 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53  r(pPager, pagerS
292b0 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
292c0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
292d0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
292e0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
292f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
29300 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
29310 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
29320 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
29330 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
29340 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
29350 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
29360 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
29370 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
29380 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  )).  sqlite3OsCl
29390 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
293a0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ;.  sqlite3OsClo
293b0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
293c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
293d0 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74  e(pTmp);.  sqlit
293e0 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
293f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
29400 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
29410 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
29420 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
29430 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
29440 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
29450 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
29460 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
29470 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
29480 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
29490 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
294a0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
294b0 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
294c0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
294d0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
294e0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
294f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29500 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
29510 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
29520 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
29530 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
29540 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
29550 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
29560 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
29570 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
29580 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
29590 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
295a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
295b0 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
295c0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
295d0 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
295e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
295f0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
29600 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
29610 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
29620 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
29630 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
29640 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
29650 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
29660 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
29670 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
29680 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
29690 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
296a0 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
296b0 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
296c0 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
296d0 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
296e0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
296f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
29700 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  er.noSync flag i
29710 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
29720 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
29730 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
29740 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
29750 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
29760 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
29770 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ode and the .** 
29780 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
29790 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69  istics of the fi
297a0 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
297b0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
297c0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
297d0 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
297e0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
297f0 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
29800 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
29810 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
29820 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
29830 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
29840 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
29850 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
29860 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
29870 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
29880 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
29890 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
298a0 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
298b0 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
298c0 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
298d0 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
298e0 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
298f0 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
29900 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
29910 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
29920 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
29930 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
29940 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
29950 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
29960 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
29970 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
29980 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
29990 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
299a0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
299b0 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
299c0 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
299d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
299e0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
299f0 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
29a00 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
29a10 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
29a20 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
29a30 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
29a40 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
29a50 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
29a60 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
29a70 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
29a80 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
29a90 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
29aa0 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
29ab0 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
29ac0 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
29ad0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
29ae0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
29af0 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
29b00 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
29b10 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
29b20 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
29b30 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
29b40 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
29b50 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
29b60 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
29b70 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
29b80 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
29b90 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
29ba0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
29bb0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
29bc0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
29bd0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
29be0 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
29bf0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29c20 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
29c30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
29c40 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
29c50 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
29c60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
29c70 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
29c80 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
29c90 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
29ca0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
29cb0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
29cc0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
29cd0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
29ce0 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
29cf0 4c 6f 63 6b 28 70 50 61 67 65 72 2c 20 30 2c 20  Lock(pPager, 0, 
29d00 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
29d10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29d20 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
29d30 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
29d40 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
29d50 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
29d60 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
29d70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
29d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
29d90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
29da0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
29db0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
29dc0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
29dd0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
29de0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
29df0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29e00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
29e10 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
29e20 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
29e30 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
29e40 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
29e50 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
29e60 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
29e70 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
29e80 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
29e90 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
29ea0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
29eb0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
29ec0 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
29ed0 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
29ee0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
29ef0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
29f00 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
29f10 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
29f20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
29f30 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
29f40 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
29f50 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
29f60 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
29f70 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
29f80 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
29f90 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
29fa0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
29fb0 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
29fc0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
29fd0 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
29fe0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
29ff0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
2a000 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
2a010 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
2a020 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
2a030 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
2a040 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
2a050 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
2a060 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
2a070 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
2a080 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
2a090 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
2a0a0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
2a0b0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
2a0c0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
2a0d0 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
2a0e0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
2a0f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2a100 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
2a110 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
2a120 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
2a130 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
2a140 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
2a150 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
2a160 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
2a170 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
2a180 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
2a190 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
2a1a0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
2a1b0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
2a1c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2a1d0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
2a1e0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
2a1f0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
2a200 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
2a210 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
2a220 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
2a230 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
2a240 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
2a250 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
2a260 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
2a270 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
2a280 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
2a290 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
2a2a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2a2b0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
2a2c0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
2a2d0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
2a2e0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
2a2f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
2a300 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
2a310 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
2a320 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
2a330 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
2a340 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
2a350 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
2a360 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
2a370 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
2a380 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
2a390 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
2a3a0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
2a3b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
2a3c0 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
2a3d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
2a3e0 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
2a3f0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
2a400 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
2a410 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
2a420 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
2a430 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
2a440 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
2a450 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
2a460 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
2a470 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
2a480 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
2a490 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
2a4a0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
2a4b0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
2a4c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
2a4d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a4e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2a4f0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
2a500 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
2a510 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2a520 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
2a530 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
2a540 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
2a550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
2a560 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
2a570 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
2a580 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a590 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2a5a0 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
2a5b0 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
2a5c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
2a5d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a5e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
2a5f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
2a600 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
2a610 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2a620 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2a630 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2a640 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
2a650 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a660 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
2a670 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
2a680 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
2a690 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
2a6a0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
2a6b0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
2a6c0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
2a6d0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
2a6e0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
2a6f0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
2a700 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
2a710 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
2a720 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
2a730 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2a740 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
2a750 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
2a760 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
2a770 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
2a780 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
2a790 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
2a7a0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
2a7b0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
2a7c0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
2a7d0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
2a7e0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
2a7f0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
2a800 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
2a810 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
2a820 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
2a830 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
2a840 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
2a850 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
2a860 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
2a870 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
2a880 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
2a890 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
2a8a0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
2a8b0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
2a8c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
2a8d0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
2a8e0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
2a8f0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
2a900 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2a910 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
2a920 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
2a930 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
2a940 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a950 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2a960 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2a970 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
2a980 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2a990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2a9a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2a9b0 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
2a9c0 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
2a9d0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2a9e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
2a9f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2aa00 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
2aa20 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
2aa30 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
2aa40 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
2aa50 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
2aa60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2aa70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2aa80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2aa90 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
2aaa0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
2aab0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
2aac0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2aad0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
2aae0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
2aaf0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
2ab00 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
2ab10 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2ab20 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
2ab30 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2ab40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2ab50 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
2ab60 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
2ab70 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
2ab80 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
2ab90 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
2aba0 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
2abb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2abc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2abd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2abe0 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
2abf0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
2ac00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2ac10 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
2ac20 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
2ac30 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
2ac40 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
2ac50 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
2ac60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2ac70 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
2ac80 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
2ac90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2aca0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2acb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2acc0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
2acd0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2ace0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2acf0 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
2ad00 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
2ad10 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
2ad20 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
2ad30 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
2ad40 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
2ad50 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
2ad60 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
2ad70 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
2ad80 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
2ad90 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
2ada0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2adb0 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
2adc0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2add0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
2ade0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
2adf0 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
2ae00 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2ae10 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2ae20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ae30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
2ae40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2ae50 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
2ae60 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
2ae70 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
2ae80 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
2ae90 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
2aea0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
2aeb0 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
2aec0 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
2aed0 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
2aee0 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
2aef0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
2af00 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
2af10 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
2af20 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
2af30 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
2af40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2af50 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
2af60 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
2af70 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
2af80 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2af90 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2afa0 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
2afb0 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
2afc0 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
2afd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2afe0 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
2aff0 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
2b000 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
2b010 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
2b020 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
2b030 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
2b040 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
2b050 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
2b060 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b070 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
2b080 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
2b090 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
2b0a0 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
2b0b0 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
2b0c0 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
2b0d0 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
2b0e0 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
2b0f0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
2b100 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
2b110 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
2b120 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
2b130 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
2b140 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
2b150 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
2b160 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
2b170 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
2b180 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
2b190 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
2b1a0 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
2b1b0 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
2b1c0 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
2b1d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2b1e0 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
2b1f0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
2b200 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2b210 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
2b220 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
2b230 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
2b240 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
2b250 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
2b260 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
2b270 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
2b280 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
2b290 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
2b2a0 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
2b2b0 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
2b2c0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
2b2d0 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
2b2e0 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
2b2f0 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
2b300 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
2b310 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
2b320 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
2b330 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
2b340 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2b350 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2b360 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2b370 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b380 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2b390 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
2b3a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2b3b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
2b3c0 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
2b3d0 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
2b3e0 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
2b3f0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2b400 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2b410 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
2b420 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
2b430 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
2b440 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
2b450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b470 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2b480 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
2b490 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
2b4a0 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
2b4b0 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
2b4c0 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
2b4d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
2b4e0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2b4f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b500 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2b510 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2b520 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2b530 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
2b540 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
2b550 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
2b560 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
2b570 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2b580 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72  ) || pList->pDir
2b590 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
2b5a0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
2b5b0 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
2b5c0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2b5d0 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
2b5e0 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
2b5f0 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
2b600 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
2b610 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
2b620 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
2b630 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
2b640 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
2b650 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
2b660 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
2b670 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2b680 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
2b690 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2b6a0 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
2b6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2b6c0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
2b6d0 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
2b6e0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
2b6f0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
2b700 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65  .  /* Before the
2b710 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69   first write, gi
2b720 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e  ve the VFS a hin
2b730 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69  t of what the fi
2b740 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69  nal.  ** file si
2b750 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f  ze will be..  */
2b760 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2b770 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
2b780 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2b790 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2b7a0 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61  TE_OK .   && pPa
2b7b0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c  ger->dbHintSize<
2b7c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20  pPager->dbSize. 
2b7d0 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69    && (pList->pDi
2b7e0 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67  rty || pList->pg
2b7f0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  no>pPager->dbHin
2b800 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20  tSize).  ){.    
2b810 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
2b820 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
2b830 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
2b840 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
2b850 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
2b860 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2b870 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
2b880 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
2b890 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
2b8a0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
2b8b0 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
2b8c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
2b8d0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
2b8e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
2b8f0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
2b900 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
2b910 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b920 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
2b930 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
2b940 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
2b950 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
2b960 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
2b970 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
2b980 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
2b990 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
2b9a0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
2b9b0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
2b9c0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
2b9d0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
2b9e0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
2b9f0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
2ba00 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
2ba10 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
2ba20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
2ba30 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
2ba40 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
2ba50 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
2ba60 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
2ba70 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
2ba80 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2ba90 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
2baa0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
2bab0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
2bac0 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
2bad0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
2bae0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
2baf0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
2bb00 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
2bb10 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
2bb20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
2bb30 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
2bb40 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb60 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
2bb70 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
2bb80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2bb90 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2bba0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2bbb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
2bbc0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
2bbd0 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
2bbe0 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
2bbf0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
2bc00 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
2bc10 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
2bc20 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
2bc30 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
2bc40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2bc50 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a  M_BKPT, pData);.
2bc60 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
2bc70 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
2bc80 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
2bc90 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2bca0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
2bcb0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
2bcc0 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
2bcd0 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
2bce0 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
2bcf0 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
2bd00 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
2bd10 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
2bd20 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
2bd30 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
2bd40 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
2bd50 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
2bd60 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
2bd70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bd80 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
2bd90 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
2bda0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2bdb0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
2bdc0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2bdd0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
2bde0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
2bdf0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
2be00 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
2be10 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
2be20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2be30 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
2be40 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2be50 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
2be60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
2be70 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
2be80 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
2be90 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
2bea0 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
2beb0 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
2bec0 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
2bed0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
2bee0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
2bef0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
2bf00 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
2bf10 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
2bf20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2bf30 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
2bf40 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2bf70 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
2bf80 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
2bf90 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2bfa0 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
2bfb0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
2bfc0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
2bfd0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
2bfe0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
2bff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c000 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
2c010 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2c020 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2c030 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
2c040 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
2c050 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
2c060 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
2c070 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2c080 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2c090 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
2c0a0 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
2c0b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2c0c0 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
2c0d0 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
2c0e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
2c0f0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
2c100 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2c110 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
2c120 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
2c130 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
2c140 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
2c150 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
2c160 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
2c170 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
2c180 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
2c190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
2c1a0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
2c1b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2c1c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c1d0 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
2c1e0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2c1f0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
2c200 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45   flags =  SQLITE
2c210 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2c220 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
2c230 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20  EADWRITE .      
2c240 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
2c250 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
2c260 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20  EN_EXCLUSIVE .  
2c270 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
2c280 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
2c290 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70  .    int nStmtSp
2c2a0 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e  ill = sqlite3Con
2c2b0 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a  fig.nStmtSpill;.
2c2c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2c2d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2c2e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2c2f0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
2c300 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
2c310 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c  .      nStmtSpil
2c320 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  l = -1;.    }.  
2c330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2c340 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
2c350 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65  ->pVfs, 0, pPage
2c360 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20  r->sjfd, flags, 
2c370 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d  nStmtSpill);.  }
2c380 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c390 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
2c3a0 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
2c3b0 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
2c3c0 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
2c3d0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a  ub-journal. .**.
2c3e0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2c3f0 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
2c400 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2c410 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
2c420 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
2c430 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
2c440 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
2c450 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
2c460 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2c470 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2c480 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2c490 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
2c4a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2c4b0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
2c4c0 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
2c4d0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2c4e0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2c4f0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
2c500 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
2c510 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
2c520 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
2c530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c540 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
2c550 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
2c560 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c570 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2c580 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2c590 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
2c5a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2c5b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2c5c0 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  F ){..    /* Ope
2c5d0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2c5e0 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  l, if it has not
2c5f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
2c600 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ened */.    asse
2c610 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2c620 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
2c630 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2c640 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67  ger->jfd) || pag
2c650 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2c660 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c670 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2c680 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2c690 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20  nSubRec==0 );.  
2c6a0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
2c6b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
2c6c0 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
2c6d0 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
2c6e0 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20   pPg) .         
2c6f0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2c700 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2c710 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2c720 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2c730 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2c740 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2c750 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2c760 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2c770 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2c780 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2c790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2c7a0 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2c7b0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2c7c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c7d0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2c7e0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2c7f0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2c800 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2c810 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2c820 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2c830 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2c840 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ..#if SQLITE_HAS
2c850 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20  _CODEC   .      
2c860 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62  if( !pPager->sub
2c870 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2c880 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2c890 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
2c8a0 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
2c8b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2c8c0 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  T, pData2);.    
2c8d0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2c8e0 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 70 44       pData2 = pD
2c8f0 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52  ata;.      PAGER
2c900 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
2c910 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
2c920 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2c930 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2c940 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
2c950 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2c960 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
2c970 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2c980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2c9a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2c9b0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
2c9c0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
2c9d0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
2c9e0 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
2c9f0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
2ca00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ca10 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
2ca20 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
2ca30 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2ca40 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
2ca50 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
2ca60 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
2ca70 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
2ca80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
2ca90 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2caa0 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2cab0 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ed(PgHdr *pPg){.
2cac0 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2cad0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2cae0 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75     return subjou
2caf0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2cb00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2cb10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cb20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2cb30 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2cb40 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2cb50 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2cb60 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2cb70 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2cb80 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2cb90 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2cba0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2cbb0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2cbc0 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2cbd0 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2cbe0 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2cbf0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2cc00 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2cc10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2cc20 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2cc30 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2cc40 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2cc50 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2cc60 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2cc70 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2cc80 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2cc90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2cca0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2ccb0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2ccc0 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2ccd0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2cce0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2ccf0 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2cd00 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2cd10 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2cd20 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2cd30 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2cd40 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2cd50 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2cd60 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2cd70 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2cd80 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2cd90 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2cda0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2cdb0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2cdc0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2cdd0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2cde0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2cdf0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2ce00 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2ce10 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2ce20 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2ce30 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2ce40 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2ce50 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2ce60 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2ce70 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2ce80 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2ce90 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2cea0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2ceb0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2cec0 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2ced0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2cee0 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2cef0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2cf00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2cf10 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2cf20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2cf30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2cf40 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2cf50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2cf60 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2cf70 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2cf80 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59   doNotSpill NOSY
2cf90 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75  NC bit is set du
2cfa0 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
2cfb0 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
2cfc0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
2cfd0 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
2cfe0 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
2cff0 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
2d000 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
2d010 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2d020 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
2d030 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
2d040 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
2d050 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
2d060 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
2d070 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
2d080 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2d090 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46  ROLLBACK and OFF
2d0a0 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61   bits inhibits a
2d0b0 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
2d0c0 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73  g.  ** regardles
2d0d0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
2d0e0 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
2d0f0 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
2d100 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a   set during.  **
2d110 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62   a rollback or b
2d120 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20  y user request, 
2d130 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
2d140 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
2d150 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
2d160 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
2d170 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
2d180 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
2d190 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
2d1a0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
2d1b0 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
2d1c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74  mplementation it
2d1d0 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2d1e0 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2d1f0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2d200 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2d210 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20  createFlag==3.  
2d220 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2d230 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2d240 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2d250 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2d260 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2d270 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2d280 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2d290 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2d2a0 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2d2b0 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2d2c0 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2d2d0 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2d2e0 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2d2f0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2d300 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2d310 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2d320 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2d330 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2d340 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2d350 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2d360 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2d370 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2d380 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2d390 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2d3a0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2d3b0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2d3c0 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2d3d0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2d3e0 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2d3f0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2d400 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2d410 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2d420 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2d430 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2d440 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2d450 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2d460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2d470 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
2d480 5b 50 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c  [PAGER_STAT_SPIL
2d490 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e 70 44 69  L]++;.  pPg->pDi
2d4a0 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2d4b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2d4c0 72 29 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  r) ){.#ifndef SQ
2d4d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
2d4e0 52 45 4e 54 0a 20 20 20 20 2f 2a 20 49 66 20 74  RENT.    /* If t
2d4f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2d500 73 20 61 20 22 42 45 47 49 4e 20 43 4f 4e 43 55  s a "BEGIN CONCU
2d510 52 52 45 4e 54 22 20 74 72 61 6e 73 61 63 74 69  RRENT" transacti
2d520 6f 6e 2c 20 74 68 65 20 70 61 67 65 20 0a 20 20  on, the page .  
2d530 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66    ** cannot be f
2d540 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
2d550 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 6e 20  Return early in 
2d560 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20  this case. */.  
2d570 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
2d580 6c 6c 52 65 61 64 20 29 20 72 65 74 75 72 6e 20  llRead ) return 
2d590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
2d5a0 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
2d5b0 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
2d5c0 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
2d5d0 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
2d5e0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2d5f0 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50  ageIfRequired(pP
2d600 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d  g); .    if( rc=
2d610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d620 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
2d630 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
2d640 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
2d650 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0a  }.  }else{.    .
2d660 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d670 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
2d680 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28 20  C_WRITE.    if( 
2d690 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2d6a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2d6b0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2d6c0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
2d6d0 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
2d6e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2d6f0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2d700 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
2d710 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
2d720 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2d730 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2d740 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2d750 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2d760 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2d770 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2d780 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2d790 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2d7a0 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2d7b0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2d7c0 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2d7d0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2d7e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d7f0 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
2d800 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2d810 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2d820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d830 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
2d840 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2d850 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2d860 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2d870 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
2d880 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
2d890 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
2d8a0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2d8b0 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
2d8c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d8d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2d8e0 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
2d8f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2d900 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2d910 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
2d920 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
2d930 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
2d940 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2d950 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f  ager, rc); .}../
2d960 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75  *.** Flush all u
2d970 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74  nreferenced dirt
2d980 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e  y pages to disk.
2d990 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2d9a0 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20  agerFlush(Pager 
2d9b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2d9c0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
2d9d0 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d  Code;.  if( !MEM
2d9e0 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
2d9f0 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
2da00 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
2da10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2da20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
2da30 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2da40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2da50 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2da60 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2da70 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e  .      PgHdr *pN
2da80 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
2da90 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rty;.      if( p
2daa0 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  List->nRef==0 ){
2dab0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2dac0 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a  gerStress((void*
2dad0 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b  )pPager, pList);
2dae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2daf0 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
2db00 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2db10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2db20 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2db30 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
2db40 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
2db50 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
2db60 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
2db70 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
2db80 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
2db90 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
2dba0 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
2dbb0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
2dbc0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
2dbd0 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
2dbe0 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2dbf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2dc00 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2dc10 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2dc20 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2dc30 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2dc40 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2dc50 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2dc60 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2dc70 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2dc80 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2dc90 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2dca0 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2dcb0 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2dcc0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2dcd0 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2dce0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2dcf0 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2dd00 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2dd10 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2dd20 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2dd30 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2dd40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2dd50 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2dd60 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2dd70 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2dd80 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2dd90 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2dda0 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2ddb0 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2ddc0 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2ddd0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2dde0 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2ddf0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2de00 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2de10 20 20 57 68 65 6e 20 61 20 6e 65 77 20 70 61 67    When a new pag
2de20 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
2de30 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 38 20 62  the.** first 8 b
2de40 79 74 65 73 20 6f 66 20 74 68 69 73 20 73 70 61  ytes of this spa
2de50 63 65 20 61 72 65 20 7a 65 72 6f 65 64 20 62 75  ce are zeroed bu
2de60 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
2de70 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
2de80 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74 72 61 20  ..** (The extra 
2de90 73 70 61 63 65 20 69 73 20 75 73 65 64 20 62 79  space is used by
2dea0 20 62 74 72 65 65 20 61 73 20 74 68 65 20 4d 65   btree as the Me
2deb0 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a  mPage object.).*
2dec0 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
2ded0 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
2dee0 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
2def0 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
2df00 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
2df10 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
2df20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
2df30 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
2df40 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
2df50 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20   of the PAGER_* 
2df60 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
2df70 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
2df80 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
2df90 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2dfa0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
2dfb0 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
2dfc0 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
2dfd0 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
2dfe0 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
2dff0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
2e000 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
2e010 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2e020 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2e030 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
2e040 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
2e050 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
2e060 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
2e070 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
2e080 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
2e090 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
2e0a0 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
2e0b0 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
2e0c0 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
2e0d0 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
2e0e0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2e0f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2e100 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
2e110 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
2e120 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
2e130 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
2e140 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
2e150 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
2e160 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2e170 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2e180 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2e190 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
2e1a0 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
2e1b0 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
2e1c0 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
2e1d0 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
2e1e0 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
2e1f0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2e200 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2e210 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2e220 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2e230 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e240 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2e250 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
2e260 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
2e270 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
2e280 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2e290 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
2e2a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2e2b0 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
2e2c0 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
2e2d0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
2e2e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2e2f0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
2e300 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
2e310 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2e320 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
2e330 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
2e340 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
2e350 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
2e360 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
2e370 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2e380 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
2e390 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
2e3a0 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
2e3b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2e3c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
2e3d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2e3e0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
2e3f0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2e400 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
2e410 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
2e420 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
2e430 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
2e440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e450 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2e460 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
2e470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2e480 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a  NABLE_DESERIALIZ
2e490 45 0a 20 20 69 6e 74 20 6d 65 6d 4a 4d 20 3d 20  E.  int memJM = 
2e4a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2e4b0 4d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 6d  Memory journal m
2e4c0 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64  ode */.#else.# d
2e4d0 65 66 69 6e 65 20 6d 65 6d 4a 4d 20 30 0a 23 65  efine memJM 0.#e
2e4e0 6e 64 69 66 0a 20 20 69 6e 74 20 72 65 61 64 4f  ndif.  int readO
2e4f0 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
2e500 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2e510 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
2e520 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
2e530 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
2e540 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2e550 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
2e560 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
2e570 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
2e580 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
2e590 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
2e5a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2e5b0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
2e5c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e5d0 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
2e5e0 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
2e5f0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
2e600 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
2e610 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
2e620 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
2e630 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63  rnal */.  int pc
2e640 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2e650 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2e660 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2e670 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2e680 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2e690 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2e6a0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2e6b0 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2e6c0 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2e6d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2e6e0 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2e6f0 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2e700 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2e710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e720 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2e730 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2e740 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2e750 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2e760 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2e770 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2e780 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2e790 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2e7a0 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2e7b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2e7c0 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2e7d0 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61  l).  */.  journa
2e7e0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2e7f0 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
2e800 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20  lSize(pVfs));.. 
2e810 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
2e820 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
2e830 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65  ULL in case an e
2e840 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
2e850 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
2e860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e870 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
2e880 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45  if( flags & PAGE
2e890 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  R_MEMORY ){.    
2e8a0 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69  memDb = 1;.    i
2e8b0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2e8c0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2e8d0 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20        zPathname 
2e8e0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2e8f0 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  p(0, zFilename);
2e900 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68  .      if( zPath
2e910 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72  name==0  ) retur
2e920 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2e930 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68  KPT;.      nPath
2e940 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2e950 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2e960 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  );.      zFilena
2e970 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
2e980 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
2e990 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
2e9a0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2e9b0 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
2e9c0 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
2e9d0 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
2e9e0 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
2e9f0 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
2ea00 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
2ea10 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
2ea20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
2ea30 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
2ea40 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
2ea50 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2ea60 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2ea70 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
2ea80 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74  har *z;.    nPat
2ea90 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
2eaa0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
2eab0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2eac0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
2ead0 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  , nPathname*2);.
2eae0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2eaf0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2eb00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2eb10 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
2eb20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2eb30 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2eb40 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2eb50 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2eb60 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2eb70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2eb80 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2eb90 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2eba0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2ebb0 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2ebc0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2ebd0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2ebe0 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2ebf0 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2ec00 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2ec10 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2ec20 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2ec30 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2ec40 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2ec50 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2ec60 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2ec70 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2ec80 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2ec90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2eca0 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2ecb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ecc0 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2ecd0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2ece0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2ecf0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2ed00 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2ed10 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2ed20 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2ed30 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2ed40 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2ed50 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2ed60 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2ed70 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2ed80 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2ed90 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2eda0 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2edb0 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2edc0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2edd0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2ede0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2edf0 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2ee00 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2ee10 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2ee20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2ee30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2ee40 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2ee50 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2ee60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ee70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2ee80 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2ee90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2eea0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2eeb0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2eec0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2eed0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2eee0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2eef0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2ef00 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2ef10 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2ef20 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2ef30 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2ef40 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2ef50 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2ef60 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2ef70 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef90 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2efa0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2efb0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efd0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2efe0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2eff0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2f000 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2f010 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2f020 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2f030 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2f040 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2f050 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2f060 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2f070 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2f080 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2f090 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2f0a0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2f0b0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2f0c0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2f0d0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2f0e0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2f0f0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2f100 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2f110 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2f120 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2f130 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2f140 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2f150 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2f160 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2f170 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2f180 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2f190 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2f1a0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2f1b0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2f1c0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2f1d0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2f1e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2f1f0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2f200 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2f210 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2f220 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2f230 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2f240 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2f250 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2f260 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2f270 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2f280 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2f290 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2f2a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f2b0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2f2c0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2f2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2f2e0 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2f2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2f300 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2f310 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2f320 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2f330 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2f340 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2f350 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2f360 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2f370 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2f380 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
2f390 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2f3a0 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2f3b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2f3c0 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2f3d0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2f3e0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2f3f0 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2f400 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2f410 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2f420 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2f430 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2f440 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2f450 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2f460 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2f470 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2f480 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2f490 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2f4a0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2f4b0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2f4c0 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2f4d0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2f4e0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2f4f0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2f500 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2f510 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2f520 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2f530 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2f540 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2f550 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2f560 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2f570 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2f580 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2f590 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2f5a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2f5b0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2f5c0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2f5d0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2f5e0 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2f5f0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2f600 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2f610 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2f620 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2f630 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2f640 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2f650 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2f660 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2f670 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2f680 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2f690 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2f6a0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2f6b0 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2f6c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2f6d0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2f6e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2f6f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2f700 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f710 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2f720 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2f730 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2f740 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2f750 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2f760 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2f770 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2f780 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2f790 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2f7a0 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2f7b0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2f7c0 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2f7d0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2f7e0 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2f7f0 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2f800 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2f810 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2f820 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2f830 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2f840 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2f850 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2f860 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2f870 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2f880 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2f890 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2f8a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f8b0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2f8c0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2f8d0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2f8e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2f8f0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2f900 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2f910 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2f920 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2f930 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 23  ert( !memDb );.#
2f940 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2f950 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a  BLE_DESERIALIZE.
2f960 20 20 20 20 6d 65 6d 4a 4d 20 3d 20 28 66 6f 75      memJM = (fou
2f970 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  t&SQLITE_OPEN_ME
2f980 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66  MORY)!=0;.#endif
2f990 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2f9a0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
2f9b0 4e 5f 52 45 41 44 4f 4e 4c 59 29 21 3d 30 3b 0a  N_READONLY)!=0;.
2f9c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2f9d0 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2f9e0 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2f9f0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2fa00 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2fa10 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2fa20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2fa30 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2fa40 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2fa50 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2fa60 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2fa70 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2fa80 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2fa90 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2faa0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2fab0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2fac0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2fad0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2fae0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2faf0 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2fb00 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2fb10 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2fb20 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2fb30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fb40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2fb50 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2fb60 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2fb70 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2fb80 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
2fb90 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2fba0 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
2fbb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2fbc0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2fbd0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2fbe0 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2fbf0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2fc00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2fc10 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
2fc20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
2fc30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2fc40 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2fc50 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
2fc60 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
2fc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2fc80 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2fc90 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2fca0 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2fcb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fcc0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2fcd0 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2fce0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2fcf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2fd00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2fd10 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2fd20 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  TE.        {.   
2fd30 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
2fd40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2fd50 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2fd60 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2fd70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2fd80 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2fd90 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2fda0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2fdb0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2fdc0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2fdd0 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2fde0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
2fdf0 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2fe00 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2fe10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2fe20 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2fe30 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
2fe40 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2fe50 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20  C|(ii>>8)) ){.  
2fe60 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2fe70 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2fe80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fe90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2fea0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
2feb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f        pPager->no
2fec0 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75  Lock = sqlite3_u
2fed0 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2fee0 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20  name, "nolock", 
2fef0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  0);.      if( (i
2ff00 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
2ff10 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a  P_IMMUTABLE)!=0.
2ff20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2ff30 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2ff40 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61  ilename, "immuta
2ff50 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20  ble", 0) ){.    
2ff60 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c        vfsFlags |
2ff70 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2ff80 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
2ff90 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f    goto act_like_
2ffa0 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20  temp_file;.     
2ffb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
2ffc0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
2ffd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2ffe0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
2fff0 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
30000 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
30010 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
30020 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
30030 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
30040 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
30050 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
30060 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
30070 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
30080 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
30090 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
300a0 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
300b0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
300c0 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
300d0 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
300e0 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
300f0 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
30100 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
30110 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
30120 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
30130 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
30140 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
30150 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nal..    **.    
30160 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 61  ** This branch a
30170 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c  lso runs for fil
30180 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d  es marked as imm
30190 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a  utable..    */ .
301a0 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69  act_like_temp_fi
301b0 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  le:.    tempFile
301c0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
301d0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
301e0 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20  _READER;     /* 
301f0 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61  Pretend we alrea
30200 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a  dy have a lock *
30210 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c  /.    pPager->eL
30220 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ock = EXCLUSIVE_
30230 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74  LOCK;    /* Pret
30240 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45 58  end we are in EX
30250 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a  CLUSIVE mode */.
30260 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
30270 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ck = 1;         
30280 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20         /* Do no 
30290 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72  locking */.    r
302a0 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
302b0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
302c0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
302d0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
302e0 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
302f0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
30300 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
30310 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
30320 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
30330 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
30340 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
30350 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
30360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30370 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
30380 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
30390 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
303a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
303b0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
303c0 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
303d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
303e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
303f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
30400 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
30410 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28  object. */.  if(
30420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30430 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52  {.    nExtra = R
30440 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
30450 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
30460 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61 3c 31  a>=8 && nExtra<1
30470 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  000 );.    rc = 
30480 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
30490 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
304a0 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
304b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304c0 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
304d0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
304e0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
304f0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
30500 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
30510 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  or occurred abov
30520 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67  e, free the  Pag
30530 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
30540 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
30550 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
30560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30570 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
30580 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
30590 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
305a0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
305b0 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
305c0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
305d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
305e0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
305f0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
30600 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
30610 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
30620 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
30630 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
30640 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
30650 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
30660 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
30670 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
30680 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
30690 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
306a0 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
306b0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
306c0 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
306d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
306e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
306f0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
30700 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
30710 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
30720 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
30730 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
30740 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
30750 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
30760 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
30770 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
30780 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
30790 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
307a0 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
307b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
307c0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
307d0 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
307e0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
307f0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
30800 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
30810 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
30820 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
30830 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
30840 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
30850 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
30860 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
30870 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
30880 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
30890 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
308a0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
308b0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
308c0 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
308d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
308e0 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
308f0 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
30900 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
30910 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
30920 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
30930 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
30940 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
30950 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
30960 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30970 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
30980 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
30990 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d  ger->extraSync==
309a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
309b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
309c0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
309d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
309e0 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
309f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
30a00 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
30a10 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
30a20 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20  xtraSync = 0;.  
30a30 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
30a40 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
30a50 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
30a60 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
30a70 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
30a80 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51 4c 49 54  _NORMAL | (SQLIT
30a90 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c 32  E_SYNC_NORMAL<<2
30aa0 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  );.  }.  /* pPag
30ab0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
30ac0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
30ad0 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
30ae0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
30af0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
30b00 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
30b10 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
30b20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
30b30 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
30b40 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
30b50 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
30b60 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
30b70 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
30b80 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
30b90 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
30ba0 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
30bb0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
30bc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
30bd0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
30be0 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
30bf0 73 65 20 69 66 28 20 6d 65 6d 44 62 20 7c 7c 20  se if( memDb || 
30c00 6d 65 6d 4a 4d 20 29 7b 0a 20 20 20 20 70 50 61  memJM ){.    pPa
30c10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
30c20 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
30c30 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
30c40 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
30c50 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
30c60 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
30c70 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
30c80 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
30c90 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
30ca0 65 69 6e 69 74 3b 0a 20 20 73 65 74 47 65 74 74  einit;.  setGett
30cb0 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
30cc0 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
30cd0 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
30ce0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
30cf0 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
30d00 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
30d10 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
30d20 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
30d30 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
30d40 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
30d50 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
30d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30d70 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .}..../*.** This
30d80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30d90 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
30da0 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
30db0 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
30dc0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
30dd0 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
30de0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
30df0 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
30e00 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
30e10 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
30e20 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
30e30 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
30e40 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
30e50 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
30e60 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
30e70 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
30e80 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
30e90 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
30ea0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
30eb0 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
30ec0 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
30ed0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
30ee0 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
30ef0 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
30f00 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
30f10 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
30f20 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
30f30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
30f40 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
30f50 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
30f60 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
30f70 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
30f80 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
30f90 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
30fa0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
30fb0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
30fc0 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
30fd0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
30fe0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
30ff0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
31000 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
31010 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
31020 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
31030 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
31040 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
31050 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
31060 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
31070 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
31080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31090 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
310a0 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
310b0 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
310c0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
310d0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
310e0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
310f0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
31100 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
31110 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
31120 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
31130 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
31140 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
31150 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
31160 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
31170 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
31180 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
31190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
311a0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
311b0 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
311c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
311d0 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
311e0 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
311f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
31200 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
31210 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
31220 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31230 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
31240 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
31250 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
31260 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
31270 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
31280 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
31290 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
312a0 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
312b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
312c0 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
312d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
312e0 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
312f0 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
31300 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
31310 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
31320 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
31330 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
31340 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
31350 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
31360 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
31370 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
31380 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
31390 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
313a0 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
313b0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
313c0 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
313d0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
313e0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
313f0 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
31400 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
31410 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
31420 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
31430 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
31440 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
31450 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
31460 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
31470 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
31480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
31490 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
314a0 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
314b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
314c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
314d0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
314e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
314f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
31500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
31510 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
31520 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
31530 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
31540 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
31550 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
31560 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
31570 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
31580 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
31590 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
315a0 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
315b0 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
315c0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
315d0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
315e0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
315f0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
31600 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
31610 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
31620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31630 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
31640 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
31650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31660 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
31670 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
31680 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
31690 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
316a0 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
316b0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
316c0 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
316d0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
316e0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
316f0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
31700 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
31710 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
31720 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
31730 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
31740 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
31750 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
31760 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
31770 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
31780 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
31790 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
317a0 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
317b0 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
317c0 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
317d0 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
317e0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
317f0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
31800 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
31810 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
31820 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
31830 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
31840 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
31850 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
31860 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
31870 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
31880 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
31890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
318a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
318b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
318c0 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
318d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
318e0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
318f0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31910 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
31920 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
31930 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
31940 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
31950 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ile==0 );.      
31960 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
31970 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
31980 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
31990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
319a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
319b0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65  e database is ze
319c0 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ro pages in size
319d0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
319e0 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65  t either (1) the
319f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
31a00 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74  nal is a remnant
31a10 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61   from a prior da
31a20 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
31a30 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a  same name where.
31a40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
31a50 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74  atabase file but
31a60 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
31a70 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72   was deleted, or
31a80 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c   (2) the initial
31a90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
31aa0 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70  saction that pop
31ab0 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74  ulates a new dat
31ac0 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72  abase is being r
31ad0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
31ae0 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
31af0 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e   case, the journ
31b00 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64  al file can be d
31b10 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72  eleted.  However
31b20 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20  , take care.    
31b30 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65      ** not to de
31b40 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
31b50 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61   file if it is a
31b60 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20  lready open due 
31b70 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  to.        ** jo
31b80 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
31b90 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ST..        */. 
31ba0 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
31bb0 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e  ==0 && !jrnlOpen
31bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
31bd0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
31be0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
31bf0 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
31c00 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
31c10 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
31c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31c30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
31c40 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
31c50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
31c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31c70 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
31c80 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
31c90 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
31ca0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
31cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31cc0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
31cd0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
31ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31cf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
31d00 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
31d10 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
31d20 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
31d30 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
31d40 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
31d50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31d60 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
31d70 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
31d80 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
31d90 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
31da0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
31db0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
31dc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
31dd0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
31de0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
31df0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
31e00 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
31e10 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
31e20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
31e30 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
31e40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31e50 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
31e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
31e70 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
31e80 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
31e90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31ea0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
31eb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31ec0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
31ed0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
31ee0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
31ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31f00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31f20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
31f30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31f50 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
31f60 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
31f70 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
31f80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31f90 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
31fa0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
31fb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31fc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
31fd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
31fe0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
31ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32000 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
32010 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
32020 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32030 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
32040 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
32050 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
32060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
32070 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
32080 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
32090 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
320a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
320b0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
320c0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
320d0 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
320e0 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
320f0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
32100 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
32110 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
32120 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
32130 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
32140 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
32150 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
32160 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
32170 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
32180 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
32190 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
321a0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
321b0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
321c0 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
321d0 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
321e0 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
321f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
32200 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
32210 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
32220 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
32230 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
32240 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
32250 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
32260 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
32270 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
32280 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
32290 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
322a0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
322b0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
322c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
322d0 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
322e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
322f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
32300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
32310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
32320 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
32330 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
32340 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
32350 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
32360 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
32370 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
32380 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
32390 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
323a0 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61  gerGet() until a
323b0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
323c0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
323d0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
323e0 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
323f0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
32400 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
32410 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32420 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
32430 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
32440 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
32450 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
32460 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
32470 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
32480 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
32490 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
324a0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
324b0 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
324c0 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
324d0 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
324e0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
324f0 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
32500 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
32510 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
32520 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
32530 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
32540 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
32550 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
32560 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
32570 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
32580 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
32590 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
325a0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
325b0 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
325c0 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
325d0 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
325e0 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
325f0 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
32600 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
32610 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
32620 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
32630 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
32640 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32650 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
32660 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
32670 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
32680 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
32690 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
326a0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
326b0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
326c0 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
326d0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
326e0 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
326f0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
32700 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
32710 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
32720 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
32730 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
32740 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
32750 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
32760 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
32770 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
32780 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
32790 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
327a0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
327b0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
327c0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
327d0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
327e0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
327f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
32800 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
32810 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
32820 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
32830 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
32840 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
32850 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
32860 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
32870 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
32880 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
32890 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
328a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
328b0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
328c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
328d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
328e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
328f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
32900 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
32910 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
32920 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
32930 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
32940 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
32950 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
32960 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
32970 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
32980 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
32990 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
329a0 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
329b0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
329c0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
329d0 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
329e0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
329f0 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73   mode.  */.  ass
32a00 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
32a10 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
32a20 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
32a30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
32a40 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
32a50 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
32a60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32a70 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
32a80 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
32a90 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
32aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32ab0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
32ac0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
32ad0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
32ae0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
32af0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32b00 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
32b10 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
32b20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
32b30 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
32b40 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
32b50 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
32b60 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
32b70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32b80 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
32b90 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
32ba0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
32bb0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
32bc0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
32bd0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
32be0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
32bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32c00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32c10 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
32c20 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
32c30 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
32c40 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
32c50 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
32c60 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
32c70 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
32c80 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
32c90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
32ca0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
32cb0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
32cc0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
32cd0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
32ce0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
32cf0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
32d00 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
32d10 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
32d20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
32d30 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
32d40 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
32d50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32d70 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32d80 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
32d90 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
32da0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
32db0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
32dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
32dd0 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
32de0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
32df0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
32e00 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
32e10 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
32e20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32e30 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
32e40 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
32e50 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
32e60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
32e70 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
32e80 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
32e90 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
32ea0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
32eb0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
32ec0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
32ed0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
32ee0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
32ef0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
32f00 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
32f10 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
32f20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
32f30 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
32f40 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
32f50 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
32f60 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
32f70 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
32f80 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
32f90 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
32fa0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
32fb0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
32fc0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
32fd0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
32fe0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
32ff0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
33000 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33010 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
33020 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
33030 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
33040 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
33050 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
33060 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
33070 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33080 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
33090 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
330a0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
330b0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
330c0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
330d0 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
330e0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
330f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
33100 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
33110 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
33120 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
33130 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
33140 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
33150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
33160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33170 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
33180 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
33190 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
331a0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
331b0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
331c0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
331d0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
331e0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
331f0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
33200 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
33210 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
33220 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
33230 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
33240 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
33250 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
33260 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
33270 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
33280 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
33290 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
332a0 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
332b0 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
332c0 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
332d0 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
332e0 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
332f0 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
33300 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
33310 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
33320 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
33330 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
33340 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
33350 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
33360 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
33370 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
33380 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
33390 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
333a0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
333b0 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
333c0 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
333d0 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
333e0 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
333f0 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
33400 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
33410 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
33420 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
33430 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
33440 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
33450 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
33460 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
33470 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
33480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
33490 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
334a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
334b0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
334c0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
334d0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
334e0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
334f0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
33500 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
33510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
33520 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
33530 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
33540 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
33550 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
33560 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
33570 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
33580 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
33590 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
335a0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
335b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
335c0 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
335d0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
335e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
335f0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
33600 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
33610 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
33620 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
33630 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
33640 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
33650 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33660 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
33670 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
33680 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
33690 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
336a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
336b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
336c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
336d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
336e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
336f0 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
33700 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
33710 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
33720 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
33730 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
33740 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
33750 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
33760 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
33780 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
33790 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
337a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
337b0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
337c0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
337d0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
337e0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
337f0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
33800 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
33810 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
33820 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
33830 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
33840 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
33850 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
33860 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
33870 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
33880 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
33890 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
338a0 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
338b0 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
338c0 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
338d0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
338e0 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
338f0 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
33900 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
33910 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
33920 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
33930 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
33940 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
33950 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
33960 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
33970 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
33980 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33990 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
339a0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
339b0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
339c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
339d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
339e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
339f0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
33a00 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
33a10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  e);.          pP
33a20 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
33a30 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
33a40 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
33a50 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
33a60 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
33a70 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
33a80 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
33a90 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
33aa0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
33ab0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33ac0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
33ad0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
33ae0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
33af0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
33b00 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
33b10 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
33b20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
33b30 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
33b40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
33b50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
33b60 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
33b70 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
33b80 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
33b90 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
33ba0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
33bb0 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
33bc0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
33bd0 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
33be0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
33bf0 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
33c00 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
33c10 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
33c20 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
33c30 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
33c40 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
33c50 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
33c60 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
33c70 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
33c80 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
33c90 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
33ca0 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
33cb0 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
33cc0 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
33cd0 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
33ce0 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
33cf0 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
33d00 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
33d10 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
33d20 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
33d30 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
33d40 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
33d50 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
33d60 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
33d70 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
33d80 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
33d90 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
33da0 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
33db0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
33dc0 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
33dd0 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
33de0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
33df0 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
33e00 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
33e10 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
33e20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
33e30 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
33e40 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
33e50 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
33e60 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
33e70 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
33e80 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
33e90 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
33ea0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
33eb0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
33ec0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
33ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
33ee0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33ef0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
33f00 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
33f10 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
33f20 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
33f30 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
33f40 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
33f50 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
33f60 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
33f70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
33f80 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
33f90 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
33fa0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
33fb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
33fc0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
33fd0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
33fe0 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74  red then check t
33ff0 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
34000 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
34010 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
34020 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
34030 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a  se has changed,.
34040 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
34050 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68  he cache.  The h
34060 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
34070 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
34080 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
34090 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74  * occurring on t
340a0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63  he very first ac
340b0 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20  cess to a file, 
340c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65  in order to save
340d0 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
340e0 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  le unnecessary s
340f0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
34100 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74  all at the start
34110 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -up..      **.  
34120 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
34130 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65  changes are dete
34140 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
34150 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
34160 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
34170 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
34180 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
34190 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
341a0 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
341b0 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
341c0 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
341d0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
341e0 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
341f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
34200 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
34210 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
34220 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
34230 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
34240 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
34250 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
34260 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
34270 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
34280 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
34290 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
342a0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
342b0 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
342c0 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
342d0 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
342e0 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
342f0 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
34300 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
34310 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
34320 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
34330 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
34340 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ];..      IOTRAC
34350 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
34360 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
34370 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
34380 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
34390 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
343a0 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
343b0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
343c0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
343d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
343e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
343f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34400 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
34410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
34420 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
34430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
34440 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
34450 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
34460 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
34470 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
34480 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
34490 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
344a0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
344b0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
344c0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
344d0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
344e0 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
344f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
34500 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
34510 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
34520 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
34530 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
34540 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
34550 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
34560 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
34570 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
34580 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
34590 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
345a0 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
345b0 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
345c0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
345d0 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
345e0 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
345f0 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
34600 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
34610 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
34620 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
34630 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
34640 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
34650 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
34660 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
34670 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
34680 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
34690 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
346a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
346b0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
346c0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
346d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
346e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
346f0 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
34700 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
34710 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
34720 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
34730 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
34740 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
34750 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
34760 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
34770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
34780 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
34790 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
347a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
347b0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
347c0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
347d0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
347e0 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
347f0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
34800 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
34810 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
34820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
34830 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
34840 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
34850 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
34860 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
34870 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67  pFile==0 && pPag
34880 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
34890 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
348a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
348b0 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
348c0 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
348d0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
348e0 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
348f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34900 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
34910 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
34920 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
34930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
34940 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
34950 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
34960 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
34970 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
34980 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
34990 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
349a0 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20  dLock = 1;.  }. 
349b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
349c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
349d0 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
349e0 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
349f0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
34a00 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
34a10 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
34a20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
34a30 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
34a40 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
34a50 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
34a60 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
34a70 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
34a80 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
34a90 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
34aa0 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
34ab0 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
34ac0 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
34ad0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
34ae0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
34af0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
34b00 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
34b10 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  er){.  if( sqlit
34b20 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
34b30 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34b40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
34b50 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  rt( pPager->nMma
34b60 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a 20 62 65  pOut==0 ); /* be
34b70 63 61 75 73 65 20 70 61 67 65 31 20 69 73 20 6e  cause page1 is n
34b80 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ever memory mapp
34b90 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 55  ed */.    pagerU
34ba0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
34bb0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
34bc0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
34bd0 67 65 74 74 65 72 20 6d 65 74 68 6f 64 73 20 65  getter methods e
34be0 61 63 68 20 74 72 79 20 74 6f 20 61 63 71 75 69  ach try to acqui
34bf0 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
34c00 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77 69 74 68  o a.** page with
34c10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
34c20 6f 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  o. If the reques
34c30 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
34c40 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
34c50 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
34c60 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
34c70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
34c80 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
34c90 2a 20 54 68 65 72 65 20 61 72 65 20 64 69 66 66  * There are diff
34ca0 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  erent implementa
34cb0 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 67 65 74  tions of the get
34cc0 74 65 72 20 6d 65 74 68 6f 64 20 64 65 70 65 6e  ter method depen
34cd0 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  ding.** on the c
34ce0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
34cf0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
34d00 20 20 20 20 20 67 65 74 50 61 67 65 4e 6f 72 6d       getPageNorm
34d10 61 6c 28 29 20 20 20 20 20 20 20 20 20 2d 2d 20  al()         -- 
34d20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74   The normal gett
34d30 65 72 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  er.**     getPag
34d40 65 45 72 72 6f 72 28 29 20 20 20 20 20 20 20 20  eError()        
34d50 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20 74 68    --  Used if th
34d60 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
34d70 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20   error state.** 
34d80 20 20 20 20 67 65 74 50 61 67 65 4d 6d 61 70 28      getPageMmap(
34d90 29 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 20  )           --  
34da0 55 73 65 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  Used if memory-m
34db0 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61  apped I/O is ena
34dc0 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  bled.**.** If th
34dd0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
34de0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
34df0 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
34e00 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
34e10 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
34e20 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
34e30 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
34e40 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
34e50 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
34e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34e70 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
34e80 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
34e90 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
34ea0 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
34eb0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
34ec0 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
34ed0 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
34ee0 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
34ef0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
34f00 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
34f10 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
34f20 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
34f30 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
34f40 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
34f50 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
34f60 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
34f70 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
34f80 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
34f90 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
34fa0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
34fb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
34fc0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
34fd0 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
34fe0 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
34ff0 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
35000 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
35010 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
35020 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
35030 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
35040 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
35050 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 0a  ted page or if .
35060 2a 2a 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  ** the flags par
35070 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
35080 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
35090 43 4f 4e 54 45 4e 54 20 62 69 74 20 61 6e 64 20  CONTENT bit and 
350a0 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
350b0 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
350c0 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
350d0 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
350e0 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
350f0 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
35100 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
35110 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
35120 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
35130 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
35140 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
35150 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e  * If PAGER_GET_N
35160 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65  OCONTENT is true
35170 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
35180 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
35190 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
351a0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
351b0 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
351c0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
351d0 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
351e0 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
351f0 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
35200 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
35210 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
35220 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
35230 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
35240 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
35250 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
35260 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
35270 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
35280 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
35290 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
352a0 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
352b0 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
352c0 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47  **.** If PAGER_G
352d0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20  ET_NOCONTENT is 
352e0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
352f0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
35300 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a  zeroed instead.*
35310 2a 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  * of being read 
35320 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
35330 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
35340 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
35350 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
35360 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
35370 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
35380 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
35390 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
353a0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
353b0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
353c0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
353d0 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
353e0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
353f0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
35400 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
35410 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
35420 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
35430 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
35440 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
35450 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
35460 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
35470 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
35480 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
35490 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
354a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
354b0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
354c0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
354d0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
354e0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
354f0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
35500 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
35510 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
35520 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
35530 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
35540 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
35550 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
35560 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
35570 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
35580 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
35590 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
355a0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
355b0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
355c0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
355d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
355e0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
355f0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
35600 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
35610 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
35620 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
35630 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
35640 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
35650 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
35660 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
35670 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
35680 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
35690 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
356a0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
356b0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
356c0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
356d0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
356e0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
356f0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  l files..*/.stat
35700 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f  ic int getPageNo
35710 72 6d 61 6c 28 0a 20 20 50 61 67 65 72 20 2a 70  rmal(.  Pager *p
35720 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
35730 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
35740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35750 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
35760 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
35770 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
35780 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
35790 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
357a0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
357b0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
357c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
357d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
357e0 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
357f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
35800 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
35810 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 75 38 20  gHdr *pPg;.  u8 
35820 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20  noContent;      
35830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35840 54 72 75 65 20 69 66 20 50 41 47 45 52 5f 47 45  True if PAGER_GE
35850 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73  T_NOCONTENT is s
35860 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  et */.  sqlite3_
35870 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61  pcache_page *pBa
35880 73 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  se;..  assert( p
35890 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
358a0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
358b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
358c0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
358d0 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
358e0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
358f0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
35900 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35910 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
35920 63 6b 3d 3d 31 20 29 3b 0a 0a 23 69 66 6e 64 65  ck==1 );..#ifnde
35930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
35940 4e 43 55 52 52 45 4e 54 0a 20 20 2f 2a 20 49 66  NCURRENT.  /* If
35950 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e 43   this is an CONC
35960 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69  URRENT transacti
35970 6f 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  on and the page 
35980 62 65 69 6e 67 20 72 65 61 64 20 77 61 73 0a 20  being read was. 
35990 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74   ** present in t
359a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
359b0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
359c0 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
359d0 2c 0a 20 20 2a 2a 20 6d 61 72 6b 20 69 74 20 61  ,.  ** mark it a
359e0 73 20 72 65 61 64 20 69 6e 20 74 68 65 20 70 41  s read in the pA
359f0 6c 6c 52 65 61 64 20 76 65 63 74 6f 72 2e 20 20  llRead vector.  
35a00 2a 2f 0a 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  */.  pPg = 0;.  
35a10 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
35a20 52 65 61 64 20 26 26 20 70 67 6e 6f 3c 3d 70 50  Read && pgno<=pP
35a30 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
35a40 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
35a50 43 45 28 28 22 55 53 49 4e 47 20 70 61 67 65 20  CE(("USING page 
35a60 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 29 3b 0a 20  %d\n", pgno));. 
35a70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
35a80 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
35a90 3e 70 41 6c 6c 52 65 61 64 2c 20 70 67 6e 6f 29  >pAllRead, pgno)
35aa0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35ab0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
35ac0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35ad0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
35ae0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65  if( pgno==0 ) re
35af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
35b00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73  UPT_BKPT;.  pBas
35b10 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
35b20 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
35b30 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29  PCache, pgno, 3)
35b40 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30  ;.  if( pBase==0
35b50 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
35b60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35b70 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65  3PcacheFetchStre
35b80 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ss(pPager->pPCac
35b90 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65  he, pgno, &pBase
35ba0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
35bb0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
35bc0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35bd0 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65  r;.    if( pBase
35be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
35bf0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
35c00 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
35c10 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35c20 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  r;.    }.  }.  p
35c30 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73  Pg = *ppPage = s
35c40 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
35c50 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
35c60 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
35c70 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Base);.  assert(
35c80 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20   pPg==(*ppPage) 
35c90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
35ca0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
35cb0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
35cc0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
35cd0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
35ce0 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20  );..  noContent 
35cf0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
35d00 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21  _GET_NOCONTENT)!
35d10 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  =0;.  if( pPg->p
35d20 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
35d30 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
35d40 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
35d50 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
35d60 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
35d70 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
35d80 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
35d90 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
35da0 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
35db0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
35dc0 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
35dd0 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
35de0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
35df0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
35e00 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48  tat[PAGER_STAT_H
35e10 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  IT]++;.    retur
35e20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
35e30 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
35e40 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
35e50 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
35e60 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
35e70 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
35e80 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
35e90 64 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d  d. But first som
35ea0 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a  e error checks:.
35eb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31      **.    ** (1
35ec0 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  ) The maximum pa
35ed0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
35ee0 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76  1.    ** (2) Nev
35ef0 65 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20  er try to fetch 
35f00 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  the locking page
35f10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35f20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
35f30 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
35f40 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
35f50 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
35f60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35f70 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
35f80 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35f90 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rr;.    }..    p
35fa0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
35fb0 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ger;..    assert
35fc0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
35fd0 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20  ->fd) || !MEMDB 
35fe0 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  );.    if( !isOp
35ff0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
36000 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
36010 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
36020 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
36030 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
36040 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
36050 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
36060 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
36070 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
36080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36090 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
360a0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
360b0 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
360c0 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
360d0 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
360e0 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
360f0 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
36100 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
36110 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
36120 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
36130 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
36140 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
36150 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
36160 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
36170 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
36180 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
36190 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
361a0 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
361b0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
361c0 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
361d0 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
361e0 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
361f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
36200 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
36210 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
36220 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
36230 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
36240 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
36250 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
36260 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
36270 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
36280 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
36290 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
362a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
362b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
362c0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
362d0 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
362e0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
362f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
36300 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
36310 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
36320 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
36330 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
36340 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
36350 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
36360 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
36370 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
36380 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
36390 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
363a0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
363b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
363c0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
363d0 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
363e0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
363f0 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d  PAGER_STAT_MISS]
36400 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
36410 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
36420 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36440 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
36450 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
36460 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
36470 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
36480 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
36490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
364a0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
364b0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
364c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
364d0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
364e0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
364f0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
36500 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
36510 70 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61  pPager);.  *ppPa
36520 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
36530 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
36540 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
36550 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67  >0./* The page g
36560 65 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d  etter for when m
36570 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
36580 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73   is enabled */.s
36590 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
365a0 65 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a  eMMap(.  Pager *
365b0 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
365c0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
365d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
365e0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
365f0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
36600 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
36610 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
36620 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
36630 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
36640 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
36650 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
36660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
36670 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
36680 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
36690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
366a0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
366b0 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
366c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
366d0 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65    /* Frame to re
366e0 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  ad from WAL file
366f0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
36700 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73  acceptable to us
36710 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d  e a read-only (m
36720 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e  map) page for an
36730 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20  y page except.  
36740 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65  ** page 1 if the
36750 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  re is no write-t
36760 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
36770 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52  or the ACQUIRE_R
36780 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61  EADONLY.  ** fla
36790 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  g was specified 
367a0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41  by the caller. A
367b0 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68  nd so long as th
367c0 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20  e db is not a . 
367d0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72   ** temporary or
367e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
367f0 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ase.  */.  const
36800 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28   int bMmapOk = (
36810 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50  pgno>1.   && (pP
36820 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36830 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66  GER_READER || (f
36840 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
36850 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b  _READONLY)).  );
36860 0a 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46  ..  assert( USEF
36870 45 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a  ETCH(pPager) );.
36880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
36890 53 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74  S_CODEC.  assert
368a0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
368b0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
368c0 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   /* Optimization
368d0 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74   note:  Adding t
368e0 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72  he "pgno<=1" ter
368f0 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d  m before "pgno==
36900 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c  0" here.  ** all
36910 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ows the compiler
36920 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65   optimizer to re
36930 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  use the results 
36940 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a  of the "pgno>1".
36950 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65    ** test in the
36960 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d   previous statem
36970 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74  ent, and avoid t
36980 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69  esting pgno==0 i
36990 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f  n the.  ** commo
369a0 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e  n case where pgn
369b0 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20  o is large. */. 
369c0 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20   if( pgno<=1 && 
369d0 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
369e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
369f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
36a00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36a10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
36a20 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
36a30 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36a40 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36a50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36a60 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
36a70 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
36a80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
36a90 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
36aa0 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f  );..  if( bMmapO
36ab0 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  k && pagerUseWal
36ac0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
36ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
36ae0 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
36af0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
36b00 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  rame);.    if( r
36b10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36b20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
36b30 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
36b40 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
36b50 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69  if( bMmapOk && i
36b60 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Frame==0 ){.    
36b70 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
36b80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36b90 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d  3OsFetch(pPager-
36ba0 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69  >fd, .        (i
36bb0 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
36bc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
36bd0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
36be0 2c 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a  , &pData.    );.
36bf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36c00 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29  TE_OK && pData )
36c10 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
36c20 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
36c30 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65  _READER || pPage
36c40 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
36c50 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c         pPg = sql
36c60 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
36c70 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
36c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36c90 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
36ca0 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
36cb0 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
36cc0 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c  er, pgno, pData,
36cd0 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65   &pPg);.      }e
36ce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
36cf0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
36d00 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
36d10 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
36d20 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
36d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36d40 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
36d50 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
36d60 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
36d70 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
36d80 67 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  g;.        retur
36d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
36da0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
36db0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36dc0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
36dd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
36de0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
36df0 7d 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61  }.  return getPa
36e00 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c  geNormal(pPager,
36e10 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
36e20 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  lags);.}.#endif 
36e30 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
36e40 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
36e50 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72   The page getter
36e60 20 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e   method for when
36e70 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e   the pager is an
36e80 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
36e90 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
36ea0 67 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72  geError(.  Pager
36eb0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
36ec0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
36ed0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36ee0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
36ef0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
36f00 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
36f10 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
36f20 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
36f30 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
36f40 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
36f50 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
36f60 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
36f70 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
36f80 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ags */.){.  UNUS
36f90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e  ED_PARAMETER(pgn
36fa0 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  o);.  UNUSED_PAR
36fb0 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20  AMETER(flags);. 
36fc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36fd0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
36fe0 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  _OK );.  *ppPage
36ff0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
37000 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37010 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20  }.../* Dispatch 
37020 61 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72  all page fetch r
37030 65 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61  equests to the a
37040 70 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65  ppropriate gette
37050 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74  r method..*/.int
37060 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
37070 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
37080 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
37090 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
370a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
370b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
370c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
370d0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
370e0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
370f0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
37100 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
37110 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
37120 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
37130 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
37140 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
37150 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
37160 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c  er->xGet(pPager,
37170 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
37180 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lags);.}../*.** 
37190 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
371a0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
371b0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
371c0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
371d0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
371e0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
371f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
37200 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
37210 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
37220 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
37230 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
37240 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
37250 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
37260 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
37270 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
37280 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
37290 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
372a0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
372b0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
372c0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
372d0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
372e0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
372f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
37300 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
37310 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
37320 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
37330 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
37340 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
37350 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
37360 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
37370 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
37380 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
37390 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  {.  sqlite3_pcac
373a0 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a  he_page *pPage;.
373b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
373c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
373d0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
373e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
373f0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50  Cache!=0 );.  pP
37400 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
37410 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
37420 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
37430 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  0);.  assert( pP
37440 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  age==0 || pPager
37450 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
37460 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ock );.  if( pPa
37470 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
37480 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
37490 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
374a0 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
374b0 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  che, pgno, pPage
374c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
374d0 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
374e0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
374f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
37500 66 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50  f() and sqlite3P
37510 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
37520 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a  () may only be.*
37530 2a 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e 6f  * used if we kno
37540 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  w that the page 
37550 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20 69  being released i
37560 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 70  s not the last p
37570 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65  age..** The btre
37580 65 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20 68  e layer always h
37590 6f 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e 20  olds page1 open 
375a0 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20 73  until the end, s
375b0 6f 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a 2a  o these first.**
375c0 20 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61 6e   to routines can
375d0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c 65   be used to rele
375e0 61 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74 68  ase any page oth
375f0 65 72 20 74 68 61 6e 20 42 74 53 68 61 72 65 64  er than BtShared
37600 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55  .pPage1..**.** U
37610 73 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  se sqlite3PagerU
37620 6e 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74 6f  nrefPageOne() to
37630 20 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e 20   release page1. 
37640 20 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f 75   This latter rou
37650 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74  tine.** checks t
37660 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
37670 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  of outstanding p
37680 61 67 65 73 20 61 6e 64 20 69 66 20 74 68 65 20  ages and if the 
37690 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
376a0 65 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  es reaches zero 
376b0 69 74 20 64 72 6f 70 73 20 74 68 65 20 64 61 74  it drops the dat
376c0 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76  abase lock..*/.v
376d0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
376e0 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50  UnrefNotNull(DbP
376f0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45 53  age *pPg){.  TES
37700 54 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70 50  TONLY( Pager *pP
37710 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
37720 65 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20  er; ).  assert( 
37730 70 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pPg!=0 );.  if( 
37740 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
37750 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61  DR_MMAP ){.    a
37760 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
37770 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65 31  !=1 );  /* Page1
37780 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79   is never memory
37790 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70   mapped */.    p
377a0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
377b0 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
377c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
377d0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
377e0 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  .  }.  /* Do not
377f0 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
37800 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  e to release the
37810 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65 20   last reference 
37820 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61 73  to page1 */.  as
37830 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
37840 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
37850 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
37860 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
37870 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
37880 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
37890 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  Pg ) sqlite3Page
378a0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
378b0 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  g);.}.void sqlit
378c0 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65  e3PagerUnrefPage
378d0 4f 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  One(DbPage *pPg)
378e0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
378f0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  r;.  assert( pPg
37900 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
37910 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
37920 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d  .  assert( (pPg-
37930 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
37940 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61  MAP)==0 ); /* Pa
37950 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d  ge1 is never mem
37960 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20  ory mapped */.  
37970 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
37980 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50  ager;.  sqlite3P
37990 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d  agerResetLockTim
379a0 65 6f 75 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eout(pPager);.  
379b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
379c0 65 61 73 65 28 70 50 67 29 3b 0a 20 20 70 61 67  ease(pPg);.  pag
379d0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
379e0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
379f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37a00 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
37a10 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
37a20 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
37a30 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
37a40 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
37a50 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
37a60 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
37a70 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
37a80 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
37a90 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
37aa0 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
37ab0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
37ac0 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
37ad0 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
37ae0 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
37af0 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
37b00 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
37b10 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
37b20 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
37b30 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
37b40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
37b50 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
37b60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37b70 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
37b80 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
37b90 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
37ba0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
37bb0 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
37bc0 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
37bd0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
37be0 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
37bf0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
37c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
37c10 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
37c20 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
37c30 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
37c40 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
37c50 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
37c60 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
37c70 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
37c80 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
37c90 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
37ca0 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
37cb0 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
37cc0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
37cd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
37ce0 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
37cf0 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
37d00 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
37d10 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
37d20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
37d30 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
37d40 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
37d50 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
37d60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
37d70 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
37d80 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
37d90 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
37da0 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
37db0 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
37dc0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
37dd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37de0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
37df0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
37e00 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
37e10 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
37e20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
37e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
37e50 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
37e60 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
37e70 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
37e80 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
37e90 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
37ea0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
37eb0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37ec0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37ed0 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
37ee0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37ef0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
37f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37f10 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
37f20 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
37f30 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
37f40 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
37f50 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
37f60 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
37f70 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
37f80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
37f90 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
37fa0 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
37fb0 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
37fc0 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
37fd0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
37fe0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
37ff0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
38000 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
38010 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
38020 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
38030 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
38040 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
38050 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
38060 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
38070 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
38080 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
38090 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
380a0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
380b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
380c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
380d0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
380e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
380f0 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
38100 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
38110 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
38120 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
38130 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
38140 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
38150 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
38160 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
38170 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
38180 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
38190 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
381a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
381b0 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
381c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
381d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
381e0 45 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  E;.        int n
381f0 53 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20  Spill;..        
38200 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
38210 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
38220 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
38230 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
38240 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
38250 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b  N_TEMP_JOURNAL);
38260 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c  .          nSpil
38270 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  l = sqlite3Confi
38280 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20  g.nStmtSpill;.  
38290 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
382a0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
382b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
382c0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
382d0 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e      nSpill = jrn
382e0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
382f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
38300 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
38310 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
38320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
38330 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65  ill has the same
38340 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20   name as it did 
38350 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
38360 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  it was originall
38370 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20  y opened. */.   
38380 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61       rc = databa
38390 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67  seIsUnmoved(pPag
383a0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
383b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
383c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
383d0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
383e0 70 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20  pen (.          
383f0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
38400 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
38410 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
38420 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  nSpill.         
38430 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
38440 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
38450 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
38460 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
38470 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
38480 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
38490 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
384a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
384b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
384c0 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
384d0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
384e0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
384f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
38500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
38510 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
38520 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
38530 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
38540 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
38550 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
38560 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
38570 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
38580 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
38590 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
385a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
385b0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
385c0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
385d0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
385e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
385f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38600 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
38610 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
38620 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
38630 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
38640 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
38650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
38660 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
38670 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
38680 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
38690 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
386a0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
386b0 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
386c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
386d0