/ Hex Artifact Content
Login

Artifact 685c46484f2854c5e262bca3f2cb793564ae0a46:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
4dc0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55   SQLITE_EXTRA_DU
4dd0: 52 41 42 4c 45 20 6f 70 74 69 6f 6e 20 69 73 20  RABLE option is 
4de0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
4df0: 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 53 51 4c  ime, then.** SQL
4e00: 69 74 65 20 77 69 6c 6c 20 64 6f 20 65 78 74 72  ite will do extr
4e10: 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61 74  a fsync() operat
4e20: 69 6f 6e 73 20 77 68 65 6e 20 73 79 6e 63 68 72  ions when synchr
4e30: 6f 6e 6f 75 73 3d 3d 46 55 4c 4c 20 74 6f 20 68  onous==FULL to h
4e40: 65 6c 70 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  elp.** ensure th
4e50: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  at transactions 
4e60: 61 72 65 20 64 75 72 61 62 6c 65 20 61 63 72 6f  are durable acro
4e70: 73 73 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ss a power failu
4e80: 72 65 2e 20 20 4d 6f 73 74 0a 2a 2a 20 61 70 70  re.  Most.** app
4e90: 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 20 68 61  lications are ha
4ea0: 70 70 79 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ppy as long as t
4eb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
4ec0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 63 72 6f 73  consistent acros
4ed0: 73 0a 2a 2a 20 61 20 70 6f 77 65 72 20 66 61 69  s.** a power fai
4ee0: 6c 75 72 65 2c 20 61 6e 64 20 61 72 65 20 70 65  lure, and are pe
4ef0: 72 66 65 63 74 6c 79 20 77 69 6c 6c 69 6e 67 20  rfectly willing 
4f00: 74 6f 20 6c 6f 73 65 20 74 68 65 20 6c 61 73 74  to lose the last
4f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4f20: 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
4f30: 74 68 65 20 65 78 74 72 61 20 70 65 72 66 6f 72  the extra perfor
4f40: 6d 61 6e 63 65 20 6f 66 20 61 76 6f 69 64 69 6e  mance of avoidin
4f50: 67 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  g directory sync
4f60: 73 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 74 68 65  s..** And so the
4f70: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
4f80: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 20 73 65  EXTRA_DURABLE se
4f90: 74 74 69 6e 67 20 69 73 20 6f 66 66 2e 0a 2a 2f  tting is off..*/
4fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fb0: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 23 20  EXTRA_DURABLE.# 
4fc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
4fd0: 54 52 41 5f 44 55 52 41 42 4c 45 20 30 0a 23 65  TRA_DURABLE 0.#e
4fe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
4ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5010: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
5020: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
5030: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
5040: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
5050: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
5060: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
5070: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
5080: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5090: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
50a0: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
50b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
50c0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
50d0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
50e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
50f0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
5100: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
5110: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
5120: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
5130: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
5140: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
5150: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5160: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
5170: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
5180: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
5190: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
51a0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
51b0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
51c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
51d0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
51e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
51f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
5200: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
5210: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
5220: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
5230: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
5240: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
5250: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
5260: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
5270: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
5280: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
5290: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
52a0: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
52b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
52c0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
52f0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
5300: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
5310: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5320: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
5330: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
5340: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
5350: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
5360: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
5370: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
5380: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
53a0: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
53b0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
53c0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53e0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
53f0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
5400: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
5410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5420: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
5430: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
5440: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
5450: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
5460: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
5470: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20 6f  };../*.** Bits o
5480: 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e 6f  f the Pager.doNo
5490: 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53 65  tSpill flag.  Se
54a0: 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72 69  e further descri
54b0: 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  ption below..*/.
54c0: 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41  #define SPILLFLA
54d0: 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30 78  G_OFF         0x
54e0: 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69 6c  01 /* Never spil
54f0: 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76 69  l cache.  Set vi
5500: 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65 66  a pragma */.#def
5510: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  ine SPILLFLAG_RO
5520: 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20 2f  LLBACK    0x02 /
5530: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5540: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5550: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5560: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5570: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f 2a  YNC      0x04 /*
5580: 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62 75   Spill is ok, bu
5590: 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a 2f  t do not sync */
55a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e 20  ../*.** An open 
55b0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
55c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
55d0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
55e0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
55f0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
5600: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
5610: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
5620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5630: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5640: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5650: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5660: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5670: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5680: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5690: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
56a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
56b0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
56c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
56d0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
56e0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
56f0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
5700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5710: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
5720: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5740: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5750: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5760: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5770: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5780: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5790: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
57a0: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
57b0: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
57c0: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
57d0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
57e0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
57f0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
5800: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
5810: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
5820: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5830: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5840: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5850: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5860: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5870: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5880: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5890: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
58a0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
58b0: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
58c0: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
58d0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
58e0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
58f0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
5900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
5910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
5920: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5930: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5940: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5950: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5960: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5970: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5990: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
59a0: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
59b0: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
59c0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
59d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59e0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
59f0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
5a00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
5a10: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
5a20: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5a30: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5a50: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5a60: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5a70: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5a80: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5a90: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5aa0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5ab0: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5ac0: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
5ad0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
5ae0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
5af0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
5b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5b10: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
5b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5b30: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5b40: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5b50: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5b60: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5b70: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5b80: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5b90: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5ba0: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
5bd0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
5be0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
5bf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
5c00: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
5c10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
5c20: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5c30: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5c40: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5c50: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5c60: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5c70: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5c80: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5c90: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5ca0: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5cb0: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5cc0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5cd0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ce0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5cf0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5d00: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5d10: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5d30: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5d40: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5d70: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5d90: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5da0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5db0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5dc0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5dd0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5de0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5df0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5e00: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5e10: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5e20: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5e30: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5e40: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5e50: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5e60: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5e70: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5e80: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5e90: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5ea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5eb0: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5ec0: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ed0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5ee0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5ef0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5f00: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5f10: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5f20: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5f30: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5f40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5f50: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5f60: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5f70: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5f80: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5f90: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5fa0: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5fb0: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5fc0: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5fd0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5fe0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5ff0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
6000: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
6010: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
6020: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
6030: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
6040: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
6050: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
6060: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
6070: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
6080: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
6090: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
60b0: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
60c0: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
60d0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
60e0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
60f0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
6100: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
6110: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
6120: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
6130: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
6140: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
6150: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
6160: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
6170: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
6180: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
6190: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
61a0: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
61b0: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
61c0: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
61d0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
61e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
61f0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
6200: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
6210: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
6220: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6230: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6240: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6250: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6260: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6270: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6280: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6290: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
62a0: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
62b0: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
62c0: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
62d0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
62e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
62f0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
6300: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6310: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6320: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6330: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6340: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6350: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6360: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6370: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6380: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6390: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
63a0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
63b0: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
63c0: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
63d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
63e0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
63f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6400: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
6410: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
6420: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6430: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6450: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6460: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6470: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6480: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6490: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
64a0: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
64b0: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
64c0: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a  e database from.
64d0: 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73 73  **   pagerStress
64e0: 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c  () is permitted,
64f0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
6500: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6510: 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20   not..**   This 
6520: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 73  flag is set by s
6530: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6540: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6550: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6560: 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72 67  ize.**   is larg
6570: 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
6580: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6590: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
65a0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
65b0: 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70 70  c.**   from happ
65c0: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
65d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
65e0: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
65f0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
6600: 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  . .**.** subjInM
6610: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
6620: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
6630: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
6640: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
6650: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
6660: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
6670: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
6680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6690: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
66a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
66b0: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
66c0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
66d0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
66e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  ..**.**   This v
66f0: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
6700: 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72 20  ed by the upper 
6710: 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65 20  layer each time 
6720: 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69 74  a new .**   writ
6730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6740: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 64   opened..**.** d
6750: 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a  bSize, dbOrigSiz
6760: 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  e, dbFileSize.**
6770: 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20 64  .**   Variable d
6780: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
67a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
67b0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
67c0: 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50 41  t is valid in PA
67d0: 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20 68  GER_READER and h
67e0: 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61 6c  igher states (al
67f0: 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74 20  l states except 
6800: 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61 6e  for.**   OPEN an
6810: 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a 2a  d ERROR). .**.**
6820: 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65 74     dbSize is set
6830: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
6840: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
6850: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
6860: 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72 67  ay be .**   larg
6870: 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
6880: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6890: 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72   (the value stor
68a0: 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ed at offset.** 
68b0: 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74 61    28 of the data
68c0: 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20 74  base header by t
68d0: 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74 68  he btree). If th
68e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
68f0: 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  le.**   is not a
6900: 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
6910: 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
6920: 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20 73  ize, the value s
6930: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64 62  tored in.**   db
6940: 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64 20  Size is rounded 
6950: 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b 42  down (i.e. a 5KB
6960: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6970: 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53 69  ge-size has dbSi
6980: 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78 63  ze==2)..**   Exc
6990: 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74 68  ept, any file th
69a0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
69b0: 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
69c0: 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
69d0: 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61 74  .**   to have at
69e0: 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
69f0: 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69 6c   (i.e. a 1KB fil
6a00: 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73  e with 2K page-s
6a10: 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20 74  ize leads.**   t
6a20: 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a 2a  o dbSize==1)..**
6a30: 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77  .**   During a w
6a40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a50: 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20  , if pages with 
6a60: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65  page-numbers gre
6a70: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 64  ater than.**   d
6a80: 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69  bSize are modifi
6a90: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
6aa0: 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74   dbSize is updat
6ab0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ed accordingly..
6ac0: 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c 20  **   Similarly, 
6ad0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6ae0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 69  is truncated usi
6af0: 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 65  ng PagerTruncate
6b00: 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20 64  Image(), .**   d
6b10: 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65 64  bSize is updated
6b20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  ..**.**   Variab
6b30: 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20 61  les dbOrigSize a
6b40: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61 72  nd dbFileSize ar
6b50: 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74 65  e valid in state
6b60: 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57 52  s .**   PAGER_WR
6b70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  ITER_LOCKED and 
6b80: 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53 69  higher. dbOrigSi
6b90: 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ze is a copy of 
6ba0: 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20 20  the dbSize.**   
6bb0: 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65 20  variable at the 
6bc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
6bd0: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
6be0: 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c 6c  used during roll
6bf0: 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20 74  back,.**   and t
6c00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
6c10: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65 73  her or not pages
6c20: 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
6c30: 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a 2a  nalled before.**
6c40: 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65     being modifie
6c50: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f 75  d..**.**   Throu
6c60: 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74 72  ghout a write-tr
6c70: 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69 6c  ansaction, dbFil
6c80: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
6c90: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20 20  he size of.**   
6ca0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69 73   in pages. It is
6cc0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6cd0: 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74 68  f dbSize when th
6ce0: 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61  e.**   write-tra
6cf0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
6d00: 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75 70  t opened, and up
6d10: 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20 63  dated when VFS c
6d20: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a  alls are made.**
6d30: 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20 74     to write or t
6d40: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
6d50: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
6d60: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  k. .**.**   The 
6d70: 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20  only reason the 
6d80: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
6d90: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
6da0: 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0a  is to suppress .
6db0: 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79  **   unnecessary
6dc0: 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63   calls to xTrunc
6dd0: 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d  ate() after comm
6de0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
6df0: 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20 20  tion. If, .**   
6e00: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
6e10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
6e20: 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20   the dbFileSize 
6e30: 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 74  variable indicat
6e40: 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74 68  es .**   that th
6e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6e60: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6e70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
6e80: 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65 29  e (Pager.dbSize)
6e90: 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  , .**   pager_tr
6ea0: 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c  uncate() is call
6eb0: 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74 72  ed. The pager_tr
6ec0: 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
6ed0: 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a 2a  es xFilesize().*
6ee0: 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20 74  *   to measure t
6ef0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f00: 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74 68   on disk, and th
6f10: 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74 20  en truncates it 
6f20: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  if required..** 
6f30: 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73 20    dbFileSize is 
6f40: 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72 6f  not used when ro
6f50: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
6f60: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
6f70: 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67 65  s case.**   page
6f80: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6f90: 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74 69  called unconditi
6fa0: 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d 65  onally (which me
6fb0: 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62 65  ans there may be
6fc0: 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f 20  .**   a call to 
6fd0: 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61 74  xFilesize() that
6fe0: 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79   is not strictly
6ff0: 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20 65   required). In e
7000: 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20 20  ither case,.**  
7010: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
7020: 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  ) may cause the 
7030: 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20 73  file to become s
7040: 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65 72  maller or larger
7050: 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53 69  ..**.** dbHintSi
7060: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ze.**.**   The d
7070: 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61 62  bHintSize variab
7080: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69  le is used to li
7090: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
70a0: 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f 0a  f calls made to.
70b0: 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46 69  **   the VFS xFi
70c0: 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f  leControl(FCNTL_
70d0: 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f  SIZE_HINT) metho
70e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48 69  d. .**.**   dbHi
70f0: 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  ntSize is set to
7100: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64   a copy of the d
7110: 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77  bSize variable w
7120: 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74 65  hen a.**   write
7130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
7140: 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73  opened (at the s
7150: 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69  ame time as dbFi
7160: 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20 20  leSize and.**   
7170: 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 20  dbOrigSize). If 
7180: 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
7190: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
71a0: 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  ) method is call
71b0: 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53  ed,.**   dbHintS
71c0: 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  ize is increased
71d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
71e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f 72  f pages that cor
71f0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a 2a  respond to the.*
7200: 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70 61  *   size-hint pa
7210: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74 68  ssed to the meth
7220: 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61 67  od call. See pag
7230: 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
7240: 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65  t() for .**   de
7250: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  tails..**.** err
7260: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  Code.**.**   The
7270: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
7280: 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20  ariable is only 
7290: 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47  ever used in PAG
72a0: 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
72b0: 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  It.**   is set t
72c0: 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74  o zero in all ot
72d0: 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50  her states. In P
72e0: 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
72f0: 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  , Pager.errCode 
7300: 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20  .**   is always 
7310: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
7320: 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
7330: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53   or one of the S
7340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
7350: 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e  .**   sub-codes.
7360: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
7370: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
7380: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
7390: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
73a0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
73b0: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
73c0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
73d0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
73e0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
73f0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
7400: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7420: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
7430: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
7440: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
7450: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
7460: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
7470: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7480: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
7490: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74b0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
74d0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
74e0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
74f0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
7500: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
7510: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
7520: 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72 61  ss */.  u8 extra
7530: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
7540: 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72 65      /* sync dire
7550: 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75 72  ctory after jour
7560: 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  nal delete */.  
7570: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7580: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7590: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
75a0: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
75b0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
75c0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
75d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
75e0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
75f0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
7600: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7610: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7620: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7630: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7640: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7650: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7670: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7680: 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61  porary or immuta
7690: 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ble file */.  u8
76a0: 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
76b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76c0: 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74  not lock (except
76d0: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f   in WAL mode) */
76e0: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
7710: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
7720: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
7750: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
7760: 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a   */..  /********
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
77c0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
77d0: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
77e0: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68   members that ch
77f0: 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a  ange during.  **
7800: 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69   routine operati
7810: 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65  on.  Class membe
7820: 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62  rs not in this b
7830: 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72 20  lock are either 
7840: 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20  fixed.  ** when 
7850: 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69 72  the pager is fir
7860: 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c  st created or el
7870: 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77  se only change w
7880: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20  hen there is a. 
7890: 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20   ** significant 
78a0: 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75 63  mode change (suc
78b0: 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68  h as changing th
78c0: 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63  e page_size, loc
78d0: 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20  king_mode,.  ** 
78e0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d  or the journal_m
78f0: 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74  ode).  From anot
7900: 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65 20  her view, these 
7910: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7920: 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20  scribe.  ** the 
7930: 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20 70  "state" of the p
7940: 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65  ager, while othe
7950: 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  r class members 
7960: 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a  describe the.  *
7970: 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  * "configuration
7980: 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  " of the pager..
7990: 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65    */.  u8 eState
79a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74     /* Pager stat
79c0: 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c  e (OPEN, READER,
79d0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e   WRITER_LOCKED..
79e0: 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  ) */.  u8 eLock;
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f     /* Current lo
7a10: 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62  ck held on datab
7a20: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
7a30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
7a40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
7a50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
7a60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
7a70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
7a80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
7a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7aa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
7ab0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
7ac0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
7ad0: 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20  oNotSpill;      
7ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7af0: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
7b00: 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  e when non-zero 
7b10: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
7b20: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
7b30: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7b40: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
7b50: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62  urnals */.  u8 b
7b60: 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20 20  UseFetch;       
7b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7b80: 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29 20  to use xFetch() 
7b90: 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53  */.  u8 hasHeldS
7ba0: 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20  haredLock;      
7bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73 68   /* True if a sh
7bc0: 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76  ared lock has ev
7bd0: 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a  er been held */.
7be0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c00: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7c10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7c20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7c30: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7c40: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7c50: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7c60: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7c70: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7c90: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7ca0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7cb0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7cc0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7cd0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7ce0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7cf0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7d00: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7d30: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7d40: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7d70: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7d80: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7d90: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7da0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7db0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7dc0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7dd0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7de0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7e10: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7e20: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7e30: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7e40: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7e50: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7e60: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7e70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7e80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7e90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7ea0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7eb0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7ec0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ed0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7ee0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ef0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7f00: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7f10: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7f20: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7f30: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7f40: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7f50: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7f60: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7f70: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7f80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7f90: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7fa0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7fb0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7fc0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7fd0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ff0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
8000: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
8010: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
8020: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
8030: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
8040: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
8050: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
8060: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
8070: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
8080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8090: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
80a0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
80b0: 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61  t[] */.  u32 iDa
80c0: 74 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20  taVersion;      
80d0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
80e0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
80f0: 65 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65  e content change
8100: 73 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  s */.  char dbFi
8110: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
8120: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
8130: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
8140: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
8150: 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b  .  int nMmapOut;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70  * Number of mmap
8180: 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
8190: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a   outstanding */.
81a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
81b0: 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  szMmap;       /*
81c0: 20 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d   Desired maximum
81d0: 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20   mmap size */.  
81e0: 50 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65  PgHdr *pMmapFree
81f0: 6c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  list;       /* L
8200: 69 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70  ist of free mmap
8210: 20 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70   page headers (p
8220: 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20  Dirty) */.  /*. 
8230: 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72   ** End of the r
8240: 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e  outinely-changin
8250: 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a  g class members.
8260: 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    **************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
82b0: 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20    u16 nExtra;   
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82d0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
82e0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
82f0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
8300: 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20   i16 nReserve;  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8320: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
8330: 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66   bytes at end of
8340: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
8350: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
8360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8370: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
8380: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
8390: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
83a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
83b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
83c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
83d0: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61  back */.  int pa
83e0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
83f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8400: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
8410: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
8420: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
8430: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
8440: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
8450: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
8460: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
8470: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
8480: 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70  Size limit for p
8490: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
84a0: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61  l files */.  cha
84b0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
84c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
84d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
84e0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
84f0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
8500: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8510: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
8520: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  le */.  int (*xB
8530: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
8540: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
8550: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
8560: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
8570: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
8580: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
8590: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
85a0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  Handler */.  int
85b0: 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20   aStat[3];      
85c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
85d0: 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69  l cache hits, mi
85e0: 73 73 65 73 20 61 6e 64 20 77 72 69 74 65 73 20  sses and writes 
85f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8600: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61  _TEST.  int nRea
8610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8620: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8630: 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65  pages read */.#e
8640: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
8650: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
8660: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
8670: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
8680: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
8690: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
86a0: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
86b0: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
86c0: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
86d0: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
86e0: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
86f0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
8700: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
8710: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
8720: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
8730: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
8740: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
8750: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
8760: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
8770: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
8780: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
8790: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
87a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
87b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
87c0: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
87d0: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
87e0: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
87f0: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
8800: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
8810: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
8820: 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50   */.  PCache *pP
8830: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
8840: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8850: 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63  page cache objec
8860: 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  t */.#ifndef SQL
8870: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57  ITE_OMIT_WAL.  W
8880: 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20  al *pWal;       
8890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
88a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73  ite-ahead log us
88b0: 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ed by "journal_m
88c0: 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68  ode=wal" */.  ch
88d0: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
88e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
88f0: 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65  e name for write
8900: 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65  -ahead log */.#e
8910: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ndif.};../*.** I
8920: 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77  ndexes for use w
8930: 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b  ith Pager.aStat[
8940: 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74  ]. The Pager.aSt
8950: 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  at[] array conta
8960: 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
8970: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61  s accessed by pa
8980: 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53  ssing SQLITE_DBS
8990: 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c  TATUS_CACHE_HIT,
89a0: 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20   CACHE_MISS .** 
89b0: 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74  or CACHE_WRITE t
89c0: 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61  o sqlite3_db_sta
89d0: 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tus()..*/.#defin
89e0: 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  e PAGER_STAT_HIT
89f0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
8a00: 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a  ER_STAT_MISS  1.
8a10: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a20: 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a  AT_WRITE 2../*.*
8a30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8a40: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8a50: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8a60: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8a70: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8a80: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8a90: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8aa0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8ab0: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8ac0: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8ad0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8ae0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8af0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8b00: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8b10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8b20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8b30: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8b40: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8b50: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8b60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8b70: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8b80: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8b90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8ba0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8bb0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8bc0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8bd0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8be0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8bf0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8c00: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8c10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8c20: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8c30: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8c40: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8c50: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8c60: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8c70: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8c80: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8c90: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8ca0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8cb0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8cc0: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8ce0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8cf0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8d00: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8d10: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8d20: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8d40: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8d50: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8d60: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8d70: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8d80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8d90: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8da0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8db0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8dc0: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8dd0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8de0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8df0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8e00: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8e10: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8e20: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8e30: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8e40: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8e50: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8e60: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8e70: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8e80: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8e90: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8ea0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8eb0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8ec0: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8ed0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8ee0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8ef0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8f00: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8f10: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8f20: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8f30: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8f40: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8f50: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8f60: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8f70: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8f80: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8f90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8fa0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8fb0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8fc0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8fd0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8fe0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8ff0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
9000: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
9010: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
9020: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
9030: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
9040: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
9050: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
9060: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
9070: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
9080: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
9090: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
90a0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
90b0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
90c0: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
90d0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
90e0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
90f0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
9100: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
9110: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
9120: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
9130: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
9140: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
9150: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
9160: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
9170: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
9180: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
9190: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
91a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
91b0: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
91c0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
91d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
91e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
91f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
9200: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9210: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
9220: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
9230: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
9240: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
9250: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
9260: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
9270: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
9280: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
9290: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
92a0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
92b0: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
92c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
92d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
92e0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
92f0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
9300: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
9310: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
9320: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
9330: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9340: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
9350: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
9360: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
9370: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
9380: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
9390: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
93a0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
93b0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
93c0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
93d0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
93e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
93f0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
9400: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
9410: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
9420: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
9430: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
9440: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
9450: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9460: 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20   macro USEFETCH 
9470: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9480: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65  e allowed to use
9490: 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20   the xFetch and 
94a0: 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65  xUnfetch.** inte
94b0: 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73  rfaces to access
94c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
94d0: 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65  ing memory-mappe
94e0: 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51  d I/O..*/.#if SQ
94f0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
9500: 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53  ZE>0.# define US
9510: 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e  EFETCH(x) ((x)->
9520: 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65  bUseFetch).#else
9530: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9540: 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a  CH(x) 0.#endif..
9550: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
9560: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
9570: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
9580: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
9590: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
95a0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
95b0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
95c0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
95d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
95e0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
95f0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
9600: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
9610: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
9620: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
9630: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
9640: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
9650: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
9660: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
9670: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
9680: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
9690: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
96a0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
96b0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
96c0: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
96d0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
96e0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
96f0: 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52  ods!=0)../*.** R
9700: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9710: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9720: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9730: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9740: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9750: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9760: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9780: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9790: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
97a0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
97b0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
97c0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
97d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
97e0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
97f0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9800: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9810: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9820: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9830: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9840: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9850: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9860: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9870: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9880: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9890: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
98a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
98b0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
98c0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
98d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
98e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
98f0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9900: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9910: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9920: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9930: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9940: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9960: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9970: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9980: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9990: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
99a0: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
99b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
99c0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
99d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
99e0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
99f0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9a00: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9a10: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9a20: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9a30: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9a40: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9a50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a60: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9a70: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9a80: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9a90: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9aa0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9ab0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9ac0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9ad0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9ae0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9af0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9b00: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9b10: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9b20: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9b40: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9b50: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9b60: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9b70: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9b80: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9b90: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9ba0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9bb0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9bc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9bd0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9be0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9bf0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9c00: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9c10: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9c20: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9c30: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9c40: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9c50: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9c60: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9c70: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9c80: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9c90: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9ca0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9cb0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9cc0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9cd0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9ce0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9cf0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9d00: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9d10: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9d20: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9d30: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9d40: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9d50: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9d60: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9d70: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9d80: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9d90: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9da0: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9db0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9dc0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9dd0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9de0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9df0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9e00: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9e10: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9e20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9e30: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9e40: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9e50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9e60: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9e70: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9e80: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9e90: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9ea0: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9eb0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9ec0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9ed0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9ee0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9ef0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9f00: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9f10: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9f20: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9f40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f60: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9f70: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9f80: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9f90: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9fa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9fb0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9fc0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9fd0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9fe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ff0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
a000: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
a010: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
a020: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
a030: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
a040: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
a050: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
a060: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
a070: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
a080: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
a090: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
a0a0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
a0b0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a0c0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
a0d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
a0e0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
a0f0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
a110: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
a120: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a130: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a140: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a150: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
a160: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
a170: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
a180: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
a190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1a0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
a1b0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
a1c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a1d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a1e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1f0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a200: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a210: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a220: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
a230: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a240: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a250: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
a260: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a270: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a280: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a290: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a2a0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a2b0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
a2c0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a2d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a2e0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a2f0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a300: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a310: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a320: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a330: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a340: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a350: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a360: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a370: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a380: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a390: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a3a0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a3b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3c0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a3e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a3f0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a400: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a410: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a420: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a440: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a450: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a460: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a470: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a480: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a490: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a4a0: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a4b0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a4c0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a4d0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a4e0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a4f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a500: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a510: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a520: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a530: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a540: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a550: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a560: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a580: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a590: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a5a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a5b0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a5d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a5e0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a5f0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a600: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a610: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a620: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a630: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a650: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a660: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a670: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a680: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a690: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a6a0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a6b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a6c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a6d0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a6e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a6f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a700: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a710: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a720: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a730: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a740: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a750: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a760: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a770: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a780: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a790: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a7a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a7b0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a7c0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a7d0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a7e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a7f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a800: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a810: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a820: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a830: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a840: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a850: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a860: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a870: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a880: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a890: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a8a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a8b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a8d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a8e0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a8f0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a900: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a910: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a920: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a930: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a940: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a950: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a960: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a970: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a980: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a990: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a9a0: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a9b0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a9c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a9d0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a9e0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a9f0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
aa00: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
aa10: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
aa20: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
aa30: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
aa40: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
aa50: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
aa60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
aa70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
aa80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
aa90: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
aaa0: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
aab0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
aac0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
aad0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
aae0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
aaf0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
ab00: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ab10: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
ab20: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
ab30: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
ab40: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
ab50: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
ab60: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ab70: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
ab80: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
ab90: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
aba0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
abb0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
abc0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
abd0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
abe0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
abf0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
ac00: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
ac10: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
ac20: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
ac30: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
ac40: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
ac50: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
ac60: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
ac70: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
ac80: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
ac90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
aca0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
acb0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
acc0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
acd0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
ace0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
acf0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
ad00: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
ad10: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
ad20: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
ad30: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ad40: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
ad50: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ad60: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
ad70: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
ad80: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
ad90: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
ada0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
adb0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
adc0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
add0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
ade0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
adf0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
ae00: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ae10: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ae20: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ae30: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ae40: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ae50: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ae60: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ae70: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ae80: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ae90: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aea0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aeb0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
aec0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
aed0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
aee0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
aef0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
af00: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
af10: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
af20: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
af30: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
af40: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
af50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
af60: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
af70: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
af80: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af90: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
afa0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
afb0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
afc0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
afd0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
afe0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
aff0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
b000: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
b010: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
b020: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
b030: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
b040: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
b050: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
b060: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
b070: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b080: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
b090: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
b0a0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b0b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
b0c0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
b0d0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0e0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
b0f0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
b100: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
b110: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
b120: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b130: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
b140: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
b150: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b160: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b170: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
b180: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
b190: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1a0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1b0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
b1c0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
b1d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1f0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
b200: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
b210: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b220: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b230: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
b240: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
b250: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b270: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
b280: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
b290: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2a0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
b2b0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
b2c0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
b2d0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
b2e0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
b2f0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
b300: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b310: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b320: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b330: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b340: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b360: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b370: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b380: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b3a0: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b3b0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b3c0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b3d0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b3e0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b3f0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b400: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b410: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b420: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b430: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b440: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b450: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b460: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b470: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b480: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b490: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b4a0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b4b0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b4d0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b4e0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b4f0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b500: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b510: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b520: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b530: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b540: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b550: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b560: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b570: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b580: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b590: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b5a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b5b0: 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53  tNotNull(p->pInS
b5c0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
b5d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b5e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
b5f0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
b600: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b620: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b630: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
b640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
b650: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b660: 49 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  InJournal(Pager 
b670: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
b680: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
b690: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
b6a0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
b6b0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
b6c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b6d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
b6e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b6f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b700: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b710: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b720: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b730: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b740: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b750: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b760: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b770: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b780: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b790: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b7a0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b7b0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b7c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b7d0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7e0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7f0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b800: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b810: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b820: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b830: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b840: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b860: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b870: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b880: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b890: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b8a0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b8b0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b8c0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b8d0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b8e0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b8f0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b900: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b910: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b920: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b930: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b940: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b950: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b960: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b970: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b980: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b990: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b9a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b9b0: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b9c0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b9d0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b9e0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b9f0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
ba00: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
ba10: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ba20: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
ba30: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
ba40: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
ba50: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
ba60: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
ba70: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
ba80: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
ba90: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
baa0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
bab0: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
bac0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
bad0: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
bae0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
baf0: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
bb00: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
bb10: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
bb20: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
bb30: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
bb40: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
bb50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
bb60: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bb70: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
bb80: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
bb90: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
bba0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
bbb0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
bbc0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
bbd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bbe0: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
bbf0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
bc00: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
bc10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
bc20: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
bc30: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
bc40: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bc50: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
bc60: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
bc70: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
bc80: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
bc90: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
bca0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
bcb0: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
bcc0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
bcd0: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
bce0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bcf0: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
bd00: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
bd10: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
bd20: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
bd30: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
bd40: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
bd50: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
bd60: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
bd70: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bd80: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
bd90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  k;.    }.    IOT
bda0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
bdb0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
bdc0: 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65  eLock)).  }.  re
bdd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bde0: 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  * Lock the datab
bdf0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
be00: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
be10: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48  ust be either SH
be20: 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45  ARED_LOCK,.** RE
be30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
be40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49  XCLUSIVE_LOCK. I
be50: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
be60: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
be70: 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  the.** Pager.eLo
be80: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
be90: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
bea0: 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  tate. .**.** Exc
beb0: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
bec0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
bed0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
bee0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bef0: 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20   .** called, do 
bf00: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e  not modify it un
bf10: 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63  less the new loc
bf20: 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58  king state is EX
bf30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a  CLUSIVE_LOCK. .*
bf40: 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  * See the commen
bf50: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
bf60: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
bf70: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
bf80: 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68  nation .** of th
bf90: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
bfa0: 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61  t pagerLockDb(Pa
bfb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bfc0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
bfd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
bfe0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
bff0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c000: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
c010: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45  LOCK || eLock==E
c020: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
c030: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
c040: 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50  Lock<eLock || pP
c050: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
c060: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c070: 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f   rc = pPager->no
c080: 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Lock ? SQLITE_OK
c090: 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   : sqlite3OsLock
c0a0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c0b0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
c0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
c0d0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
c0e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
c0f0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c100: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
c110: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c120: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
c130: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
c140: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
c150: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
c160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c180: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
c190: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c1a0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
c1b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
c1c0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
c1d0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
c1e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c1f0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
c200: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
c210: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c220: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
c230: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
c240: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
c250: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
c260: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
c270: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
c280: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
c290: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
c2a0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
c2b0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
c2c0: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
c2d0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
c2e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
c2f0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
c300: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
c310: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
c320: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
c330: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
c340: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
c350: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
c360: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
c370: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
c380: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
c390: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
c3a0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
c3b0: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
c3c0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
c3d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c3e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c3f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c400: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
c410: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
c420: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
c430: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
c440: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
c450: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
c460: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
c470: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
c480: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
c490: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
c4a0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c4b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
c4e0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
c4f0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
c500: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c520: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
c530: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
c560: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
c570: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c580: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
c590: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
c5a0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
c5b0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
c5c0: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
c5d0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
c5e0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
c5f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
c600: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c610: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
c620: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
c630: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c640: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
c650: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
c660: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
c670: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c680: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
c690: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
c6a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
c6c0: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
c6d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
c6e0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c6f0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
c700: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
c710: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
c720: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
c730: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
c740: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
c750: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
c760: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
c770: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
c780: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
c790: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c7a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c7b0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
c7c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
c7d0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
c7e0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
c7f0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
c800: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
c810: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
c820: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c830: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c840: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c850: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c860: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c870: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c880: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c890: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c8a0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c8b0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c8c0: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c8d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c8e0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c8f0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c900: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c910: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c920: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c930: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c940: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c950: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c960: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c970: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c980: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c990: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c9a0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c9b0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c9c0: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c9d0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c9e0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c9f0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
ca00: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
ca10: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
ca20: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
ca30: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
ca40: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
ca50: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
ca60: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
ca70: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
ca80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
ca90: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
caa0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
cab0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
cac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
cad0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
cae0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
caf0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
cb00: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
cb10: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
cb20: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
cb30: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
cb40: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
cb50: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
cb60: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
cb70: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
cb80: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
cb90: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
cba0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
cbb0: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
cbc0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
cbd0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
cbe0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
cbf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
cc00: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
cc10: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
cc30: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
cc40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cc50: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
cc60: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
cc70: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
cc80: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
cc90: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
cca0: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
ccb0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
ccc0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
ccd0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
cce0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
ccf0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
cd00: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
cd10: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
cd20: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
cd30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
cd40: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
cd50: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
cd60: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
cd70: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
cd80: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
cd90: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
cda0: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
cdb0: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
cdc0: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
cdd0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
cde0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
cdf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce00: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
ce10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ce20: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
ce30: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
ce40: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
ce50: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
ce60: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
ce70: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
ce80: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
ce90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
cea0: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
ceb0: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
cec0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
ced0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cee0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cef0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
cf00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
cf10: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
cf20: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
cf30: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
cf40: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
cf50: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
cf60: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
cf70: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
cf80: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
cf90: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
cfa0: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
cfb0: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
cfc0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
cfd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cfe0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cff0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
d000: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
d010: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
d020: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
d030: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d040: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
d050: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
d060: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
d070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
d080: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d090: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
d0a0: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
d0b0: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
d0c0: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
d0d0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
d0e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
d0f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d100: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
d110: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
d120: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
d130: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
d140: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d150: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
d180: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
d190: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
d1a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1c0: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
d1d0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
d1e0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
d210: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
d220: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d230: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
d240: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
d250: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
d260: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
d270: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
d280: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
d290: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d2a0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
d2b0: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
d2c0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d2d0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d2e0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
d2f0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
d300: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
d310: 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  | len==0 .   || 
d320: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d330: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d340: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
d350: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
d360: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d370: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d380: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
d390: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
d3a0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
d3b0: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
d3c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d3d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d3e0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
d3f0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
d400: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
d410: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
d420: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
d430: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
d440: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d450: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
d460: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
d470: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
d480: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
d490: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
d4a0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
d4b0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
d4c0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
d4d0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
d4e0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
d4f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
d500: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
d510: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
d520: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d530: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d540: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d550: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d560: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d570: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d580: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d590: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d5a0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d5b0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d5c0: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d5d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d5e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d5f0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d600: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d610: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d620: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d630: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d650: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d660: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d670: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d680: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d690: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d6a0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d6b0: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d6c0: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d6d0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d700: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d730: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d740: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d750: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d760: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d770: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d790: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d7a0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d7b0: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d7c0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d7d0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d7e0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d7f0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d800: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d810: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d820: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d830: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d840: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d860: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d870: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d880: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d8a0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d8b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d8c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d8d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d8f0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d900: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d910: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d920: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d930: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d950: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d960: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d970: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d980: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d990: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d9a0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d9b0: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d9c0: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d9d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d9e0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d9f0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
da00: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
da10: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
da20: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
da30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
da40: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
da50: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
da60: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
da70: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
da80: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
da90: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
daa0: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
dab0: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
dac0: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
dad0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
dae0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
daf0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
db00: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
db10: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
db20: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
db30: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
db40: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
db50: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
db60: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
db70: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
db80: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
db90: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
dba0: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
dbb0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
dbc0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
dbd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
dbe0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
dbf0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
dc00: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
dc10: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
dc20: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
dc30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dc40: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
dc50: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
dc60: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
dc70: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
dc80: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
dc90: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
dca0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
dcb0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
dcc0: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
dcd0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
dce0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
dcf0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
dd00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dd30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
dd40: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
dd50: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
dd60: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a  ssert( !sqlite3J
dd70: 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79  ournalIsInMemory
dd80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
dd90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
dda0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
ddb0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
ddc0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
ddd0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
dde0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
ddf0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
de00: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
de10: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
de20: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
de30: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
de40: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
de50: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
de60: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
de80: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
de90: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
dea0: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
deb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
dec0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
ded0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
dee0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
def0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
df00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
df10: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
df20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df30: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
df40: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
df50: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
df60: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
df70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
df80: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
df90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
dfa0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
dfb0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
dfc0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
dfd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
dfe0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
dff0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
e000: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
e010: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
e020: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
e030: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
e040: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
e050: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
e060: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
e070: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
e080: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
e090: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
e0a0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
e0b0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
e0c0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
e0d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
e0e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e0f0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
e100: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
e110: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
e120: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
e130: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
e140: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e150: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
e160: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e170: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
e180: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
e190: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
e1a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
e1b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
e1c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
e1d0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
e1e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e1f0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
e200: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
e210: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
e220: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
e230: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
e240: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
e250: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
e260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
e270: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
e280: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
e290: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
e2a0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
e2b0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
e2c0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
e2d0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
e2e0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
e2f0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
e300: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
e310: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
e320: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
e330: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
e340: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
e350: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
e360: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
e370: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
e380: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
e390: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
e3a0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
e3b0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
e3c0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
e3d0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
e3e0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
e3f0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
e400: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e420: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
e430: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e440: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e450: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e460: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e470: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
e480: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
e490: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
e4a0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
e4b0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
e4c0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e4d0: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
e4e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
e4f0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
e500: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
e510: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
e520: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
e550: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
e560: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e590: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e5a0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e5b0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
e5c0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
e5d0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e5e0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
e5f0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
e600: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e610: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
e620: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e630: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e640: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
e650: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
e660: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
e670: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
e680: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
e690: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
e6a0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e6b0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
e6c0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
e6d0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
e6e0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e6f0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e700: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e710: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e720: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e730: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e740: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e750: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e760: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e770: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e780: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e790: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e7a0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e7b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e7c0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e7d0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e7e0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e7f0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e800: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e810: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e820: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e830: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e840: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e850: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e860: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e870: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e880: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e890: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e8a0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e8b0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e8c0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e8d0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e8e0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e8f0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e900: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e910: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e920: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e930: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e940: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e950: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e960: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e970: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e980: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e990: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e9a0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e9b0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e9c0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e9d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e9e0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e9f0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
ea00: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
ea10: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
ea20: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
ea30: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
ea40: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
ea50: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
ea60: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
ea70: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
ea80: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
ea90: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
eaa0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
eab0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
eac0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
ead0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
eae0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
eaf0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
eb00: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
eb10: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
eb20: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
eb30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
eb40: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
eb50: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
eb60: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
eb70: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
eb80: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
eb90: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
eba0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
ebb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
ebc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
ebd0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
ebe0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
ebf0: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
ec00: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
ec10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ec20: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ec30: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
ec40: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
ec50: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
ec60: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
ec70: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
ec80: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
ec90: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
eca0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
ecb0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ecc0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
ecd0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
ece0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ecf0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
ed00: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
ed10: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
ed20: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
ed30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
ed40: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
ed50: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
ed60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a  initializer */ .
ed70: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
ed80: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
ed90: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
eda0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
edb0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
edc0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
edd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ede0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
edf0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
ee00: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
ee10: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
ee20: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ee30: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ee40: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
ee50: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
ee60: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
ee70: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
ee80: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
ee90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eea0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eeb0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
eec0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
eed0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
eee0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
eef0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ef00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ef10: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
ef20: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
ef30: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
ef40: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
ef50: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
ef60: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
ef70: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
ef80: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
ef90: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
efa0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
efb0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
efc0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
efd0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
efe0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
eff0: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
f000: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
f010: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
f020: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
f030: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
f040: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f050: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
f060: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
f070: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f080: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
f090: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
f0a0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
f0b0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
f0c0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
f0d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
f0e0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
f0f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f100: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
f110: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
f120: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
f130: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
f140: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
f150: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
f160: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
f170: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
f180: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
f190: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
f1a0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
f1b0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
f1c0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
f1d0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
f1e0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
f1f0: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
f200: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
f210: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
f220: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
f230: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
f240: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
f250: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
f260: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
f270: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
f280: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
f290: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
f2a0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
f2b0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
f2c0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
f2d0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
f2e0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
f2f0: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
f300: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
f310: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
f320: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
f330: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
f340: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
f350: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
f360: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
f370: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
f380: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
f390: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
f3a0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
f3b0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
f3c0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
f3d0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
f3e0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
f3f0: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
f400: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
f410: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
f420: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
f430: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
f440: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
f450: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
f460: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
f470: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
f480: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
f490: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
f4a0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f4b0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
f4c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f4d0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
f4e0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
f4f0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
f500: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
f510: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f520: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
f530: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f540: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
f550: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
f560: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
f570: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f580: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
f590: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
f5a0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
f5b0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
f5c0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
f5d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f5e0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
f5f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
f600: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
f610: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
f620: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f630: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f640: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
f650: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
f660: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
f670: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
f680: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
f690: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
f6a0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
f6b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f6c0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
f6d0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
f6e0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f6f0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f700: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f710: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f720: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f730: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f740: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f750: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f760: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f770: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f780: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f790: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f7a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f7b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f7c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f7d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f7e0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f7f0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f800: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f810: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f820: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f830: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f840: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f850: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f860: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f870: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f880: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f890: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f8a0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f8b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f8c0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f8d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f8f0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f900: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f920: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f930: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f940: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f960: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f970: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f980: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f990: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f9b0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f9c0: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f9d0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f9e0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f9f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
fa00: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
fa10: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
fa20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
fa50: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
fa60: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
fa70: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
fa80: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
fa90: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
faa0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fac0: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
fad0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
fae0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
faf0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
fb00: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
fb10: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
fb20: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
fb30: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
fb40: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
fb50: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
fb60: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
fb70: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
fb80: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
fb90: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
fba0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
fbb0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
fbc0: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
fbd0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
fbe0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
fbf0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
fc00: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
fc10: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
fc20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
fc30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
fc40: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
fc50: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
fc60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
fc70: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
fc80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
fc90: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
fca0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
fcb0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcc0: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
fcd0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
fce0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
fcf0: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
fd00: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
fd10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
fd20: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
fd30: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
fd40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
fd50: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fd60: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
fd70: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
fd80: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
fd90: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
fda0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
fdb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fdc0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
fdd0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
fde0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
fdf0: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
fe00: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
fe10: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
fe20: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
fe30: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
fe40: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
fe50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
fe60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fe70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fe80: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
fe90: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
fea0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
feb0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
fec0: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
fed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
fee0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
fef0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
ff00: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
ff10: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
ff20: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
ff30: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
ff40: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
ff50: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
ff60: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ff70: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff80: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
ff90: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
ffa0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ffb0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ffc0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ffd0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
ffe0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
fff0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10000 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10010 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10020 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
10030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10040 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
10050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10060 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
10070 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
10080 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
10090 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
100a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
100b0 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
100c0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
100d0 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
100e0 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
100f0 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
10100 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
10110 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10120 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
10130 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
10140 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
10150 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10160 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10170 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
10180 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
10190 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
101a0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
101b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
101c0 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
101d0 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
101e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
101f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
10200 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
10210 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
10220 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
10230 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
10240 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
10250 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
10260 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
10270 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
10280 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
10290 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
102a0 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
102b0 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
102c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
102d0 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
102e0 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
102f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
10300 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
10310 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
10320 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
10330 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
10340 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
10350 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
10360 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
10370 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
10380 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
10390 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
103a0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
103b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
103c0 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
103d0 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
103e0 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
103f0 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
10400 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
10410 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
10420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
10430 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10450 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
10460 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
10470 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
10480 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
10490 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
104a0 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
104b0 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
104c0 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
104d0 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
104e0 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
104f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
10500 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
10510 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
10520 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
10530 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
10540 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
10550 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
10560 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
10570 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
10580 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
10590 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
105a0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
105b0 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
105c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
105d0 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
105e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
105f0 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
10600 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10610 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
10630 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
10640 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
10650 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
10660 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
10670 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
10680 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
10690 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
106a0 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
106b0 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
106c0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
106d0 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
106e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
106f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10700 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
10710 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
10720 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
10730 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10740 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
10750 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
10760 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10770 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10780 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10790 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
107a0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
107b0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
107c0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
107d0 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
107e0 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
107f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10800 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
10810 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
10820 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10830 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10840 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10850 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10860 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10870 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10880 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10890 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
108a0 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
108b0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
108c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
108d0 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
108e0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
108f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10900 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
10910 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
10920 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10930 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10940 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10950 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10960 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10970 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10980 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10990 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
109a0 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
109b0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
109c0 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
109d0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
109e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
109f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10a00 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
10a10 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
10a20 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10a30 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10a40 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10a50 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10a60 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10a70 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10a80 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10a90 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10aa0 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10ab0 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10ac0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10ad0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10ae0 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10af0 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10b00 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10b10 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
10b20 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10b30 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10b40 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10b50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10b60 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10b70 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10b80 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10b90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10ba0 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10bb0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10bc0 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10bd0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10be0 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10bf0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10c00 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
10c10 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
10c20 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10c30 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10c40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10c50 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10c60 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10c70 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10c80 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10c90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10cc0 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10cf0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10d00 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10d30 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
10d40 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10d50 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d70 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10d80 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10d90 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10db0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10dc0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10dd0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10de0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10df0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10e00 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
10e10 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
10e20 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
10e30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e40 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10e50 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
10e60 20 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50     || !isOpen(pP
10e70 61 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a  ager->jfd).  ){.
10e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e90 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10ea0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10eb0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  1;.  assert( pPa
10ec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
10ed0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
10ee0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10ef0 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10f00 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10f10 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10f20 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10f30 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10f40 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10f50 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10f60 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10f70 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10f80 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
10f90 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
10fa0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
10fb0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
10fc0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
10fd0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10fe0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10ff0 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
11000 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
11010 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
11020 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
11030 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
11040 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
11050 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
11060 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11070 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
11080 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
11090 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
110a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
110b0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
110c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
110d0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
110e0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
110f0 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
11100 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11110 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
11120 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
11130 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
11140 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
11150 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
11160 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
11170 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
11180 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
11190 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
111a0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
111b0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
111c0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
111d0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
111e0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
111f0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11200 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11210 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
11220 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11230 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11240 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11250 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
11260 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
11270 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
11280 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11290 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
112a0 69 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20  ic, 8,.         
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b          iHdrOff+
112d0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
112e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
112f0 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
11300 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
11310 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
11320 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
11330 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
11340 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
11350 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
11360 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
11370 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
11380 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
11390 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
113a0 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
113b0 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
113c0 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
113d0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
113e0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
113f0 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
11400 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
11410 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
11420 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
11430 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
11440 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
11450 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
11460 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
11470 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
11480 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
11490 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
114a0 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
114b0 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
114c0 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
114d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
114e0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
114f0 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
11500 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
11510 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
11520 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11530 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
11540 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
11550 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
11560 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
11570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11580 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11590 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
115a0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
115b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
115c0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
115d0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
115e0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
115f0 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11600 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11610 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
11620 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
11630 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
11640 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  +;.  sqlite3Back
11650 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
11660 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
11670 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
11680 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11690 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
116a0 72 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69  rn the pPager->i
116b0 44 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75  DataVersion valu
116c0 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  e.*/.u32 sqlite3
116d0 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e  PagerDataVersion
116e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
116f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11700 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
11710 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e  OPEN );.  return
11720 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11730 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsion;.}../*.** 
11740 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
11750 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
11760 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
11770 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
11780 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
11790 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
117a0 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
117b0 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
117c0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
117d0 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
117e0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
117f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
11800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11810 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11820 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
11830 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11850 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
11860 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
11870 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
11880 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
11890 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
118a0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
118b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
118c0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
118d0 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
118e0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
118f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11900 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
11910 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
11920 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
11930 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11940 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11950 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
11960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11970 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11980 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
11990 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
119a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
119b0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
119c0 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
119d0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
119e0 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
119f0 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11a00 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11a10 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11a20 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11a30 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11a40 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11a50 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
11a60 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
11a70 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
11a80 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
11a90 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
11aa0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11ab0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11ac0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ae0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11af0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11b00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11b10 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11b20 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11b30 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11b40 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11b50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
11b60 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
11b70 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
11b80 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
11b90 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
11ba0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
11bb0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11bc0 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11bd0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11bf0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11c10 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11c50 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
11c60 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11c70 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
11c80 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
11c90 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
11ca0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
11cb0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11cc0 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11cd0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11ce0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11cf0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
11d00 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
11d10 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
11d20 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
11d30 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
11d40 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11d50 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11d60 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11d70 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11d80 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11d90 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11da0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11db0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11dc0 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11dd0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11de0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
11df0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11e00 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11e10 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
11e20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11e30 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
11e40 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11e50 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11e60 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11e70 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11e80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11e90 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11ea0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11ec0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11ed0 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11ee0 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11ef0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11f00 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11f10 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11f20 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11f30 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11f40 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11f50 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11f60 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11f70 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11f80 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11f90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11fa0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11fb0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11fc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11fd0 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11fe0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11ff0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
12000 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
12010 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
12020 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
12030 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
12040 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
12050 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
12060 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
12070 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
12080 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
12090 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
120a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
120b0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
120c0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
120d0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
120e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
120f0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12100 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
12110 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12120 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
12150 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
12160 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
12170 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
12180 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12190 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
121a0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
121b0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
121c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
121d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
121e0 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
121f0 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
12200 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
12210 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
12220 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
12230 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
12240 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
12250 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
12260 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
12270 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
12280 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
12290 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
122a0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
122b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
122c0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
122d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
122e0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
122f0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12300 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12310 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12320 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12330 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12340 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12360 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12370 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
12380 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12390 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
123a0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
123b0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
123c0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
123d0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
123e0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
123f0 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12400 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12410 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12420 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12440 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12450 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12460 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12480 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12490 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
124a0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
124b0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
124c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
124d0 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
124e0 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
124f0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12500 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
12510 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
12520 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
12530 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
12540 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12550 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
12560 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
12570 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
12580 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12590 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
125a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
125b0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
125c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
125d0 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
125e0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
125f0 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12600 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12610 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
12620 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
12630 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
12640 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12650 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
12660 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
12670 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
12680 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
12690 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
126a0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
126b0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
126c0 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
126d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
126e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
126f0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12700 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
12710 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
12720 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12730 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
12740 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12750 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
12760 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12770 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12780 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12790 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
127a0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
127b0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
127c0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
127d0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
127e0 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
127f0 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12800 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12810 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12820 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12830 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12840 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12850 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12860 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12870 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12880 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
12890 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
128a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
128b0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
128c0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
128d0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
128e0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
128f0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12900 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12920 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12930 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12940 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12950 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
12960 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12970 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12990 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
129a0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
129b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
129c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
129d0 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
129e0 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
129f0 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12a00 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12a10 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12a20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12a30 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12a40 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12a50 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12a60 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12a70 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12a80 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
12a90 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12aa0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12ab0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12ac0 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12ad0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12ae0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12af0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12b00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12b10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12b20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12b30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12b40 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12b50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12b60 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12b70 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12b80 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12b90 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12ba0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12bb0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12bc0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12bd0 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12be0 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12bf0 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12c00 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12c10 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12c20 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12c30 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12c40 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12c50 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12c60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12c70 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12c80 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12c90 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12ca0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12cb0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12cc0 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12cd0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12ce0 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12d00 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12d10 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12d20 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12d30 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12d40 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12d50 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12d60 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12d70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12d80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12d90 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12da0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12dc0 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12dd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12de0 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12df0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12e00 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12e10 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12e20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12e30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e40 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12e50 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12e60 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12e70 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12e80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12e90 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12ea0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12eb0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12ec0 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12ed0 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12ee0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12ef0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12f00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12f10 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12f20 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12f30 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12f40 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12f50 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12f60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12f70 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12f80 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12f90 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12fa0 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12fb0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12fc0 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12fd0 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12fe0 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12ff0 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
13000 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
13010 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
13020 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
13030 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
13040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13050 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
13060 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13070 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13080 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13090 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
130a0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
130b0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
130c0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
130d0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
130e0 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
130f0 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
13100 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
13110 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
13120 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
13130 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13140 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
13150 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
13160 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13170 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13180 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
131a0 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
131b0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
131c0 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
131d0 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
131e0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
131f0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13200 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
13210 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
13220 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
13230 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
13240 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
13250 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
13260 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
13270 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13280 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
13290 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
132a0 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
132b0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
132c0 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
132d0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132e0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
132f0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13300 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13310 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13320 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13330 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13340 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13350 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13360 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13370 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
13380 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
13390 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
133a0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
133b0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
133c0 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
133d0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
133e0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
133f0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13400 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13410 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13420 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13430 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13440 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13450 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
13460 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13470 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13480 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13490 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
134a0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
134b0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
134c0 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
134d0 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
134e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
134f0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13500 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13510 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13520 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13530 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13540 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13550 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
13560 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13570 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13580 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13590 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
135a0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
135b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
135c0 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
135d0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
135e0 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
135f0 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13600 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13610 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13620 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13630 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13640 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13650 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
13660 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13670 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13680 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13690 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
136a0 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
136b0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
136c0 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
136d0 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
136e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
136f0 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13700 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13710 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13720 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13730 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13740 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13750 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
13760 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13770 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13780 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13790 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
137a0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
137b0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
137c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
137d0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
137e0 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
137f0 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13800 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13810 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13820 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13830 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13840 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13850 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13860 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13870 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13880 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13890 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
138a0 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
138b0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
138c0 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
138d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
138e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
138f0 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13900 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13910 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13920 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13930 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13940 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13950 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13970 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13980 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13990 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
139a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
139b0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
139c0 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
139d0 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
139e0 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
139f0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13a00 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13a10 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13a20 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13a30 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13a40 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13a50 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
13a60 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
13a70 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
13a80 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
13a90 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13aa0 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
13ab0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13ac0 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13ad0 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13ae0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13af0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13b00 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13b10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13b20 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13b30 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13b40 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13b50 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
13b60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
13b70 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
13b80 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
13b90 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
13ba0 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
13bb0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13bc0 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13bd0 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13be0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13bf0 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13c00 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13c10 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13c20 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13c30 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13c40 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13c50 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
13c60 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13c70 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
13c80 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
13c90 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
13ca0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13cb0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13cc0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13cd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13ce0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13cf0 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13d00 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13d10 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13d20 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13d30 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13d40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13d50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13d60 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13d70 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13d80 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13d90 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13da0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13db0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13dc0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13dd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13de0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13df0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
13e00 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13e10 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
13e20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
13e30 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
13e40 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13e50 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
13e60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13e70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13e80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20  LMODE_MEMORY ); 
13e90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
13ea0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
13eb0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
13ec0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13ed0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13ee0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
13ef0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
13f20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13f40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13f50 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
13f60 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
13f70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
13f80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
13f90 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
13fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
13fb0 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66  e sure the new f
13fc0 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74  ile size is writ
13fd0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f  ten into the ino
13fe0 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  de right away.. 
13ff0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65           ** Othe
14000 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  rwise the journa
14010 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63  l might resurrec
14020 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  t following a po
14030 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20  wer loss and.   
14040 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
14050 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63  the last transac
14060 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63  tion to roll bac
14070 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20  k.  See.        
14080 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67    ** https://bug
14090 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72  zilla.mozilla.or
140a0 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  g/show_bug.cgi?i
140b0 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20  d=1072773.      
140c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
140d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
140e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
140f0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
14100 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gs);.        }. 
14110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
14120 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14130 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
14140 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14150 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14160 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14170 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
14180 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14190 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
141a0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
141b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
141c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
141d0 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
141e0 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
141f0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ter);.      pPag
14200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14210 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14220 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14230 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
14240 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
14250 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
14260 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
14270 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14280 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14290 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
142a0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
142b0 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
142c0 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
142d0 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
142e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
142f0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14310 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
14320 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
14330 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
14340 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
14350 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
14360 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
14370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14380 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14390 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
143a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
143b0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
143c0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
143d0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
143e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
143f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14400 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14410 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
14420 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14440 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14450 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
14460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
14470 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14480 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
14490 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
144a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
144b0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
144c0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
144d0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
144e0 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
144f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
14500 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
14510 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
14520 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
14530 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
14540 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
14550 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
14560 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
14570 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
14580 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
14590 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
145a0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
145b0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
145c0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
145d0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
145e0 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
145f0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
14600 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
14610 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
14620 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
14630 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
14640 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
14650 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
14660 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
14670 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14680 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
14690 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
146a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
146b0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
146c0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
146d0 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
146e0 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
146f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14700 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
14710 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
14720 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
14730 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
14740 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
14750 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
14760 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
14770 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
14780 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
14790 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
147a0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
147b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
147c0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
147d0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
147e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
147f0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
14800 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
14810 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
14820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14830 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
14840 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14850 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14860 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14870 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
14880 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
14890 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
148a0 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
148b0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
148c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
148d0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
148e0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
148f0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
14900 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
14910 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
14920 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
14930 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
14940 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14950 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14960 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
14970 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
14980 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
14990 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
149a0 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
149b0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
149c0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
149d0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
149e0 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
149f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14a00 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14a10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14a20 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14a30 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14a40 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14a50 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
14a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
14a70 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
14a80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
14a90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14aa0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
14ab0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
14ac0 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
14ad0 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
14ae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14af0 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
14b00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14b10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14b20 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
14b30 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
14b40 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
14b50 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
14b60 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
14b70 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
14b80 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
14b90 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
14ba0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
14bb0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14bc0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
14bd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
14be0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
14bf0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
14c00 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
14c10 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
14c20 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
14c30 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
14c40 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
14c50 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14c60 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
14c70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
14c80 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
14c90 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
14ca0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14cb0 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
14cc0 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
14cd0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
14ce0 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
14cf0 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
14d00 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
14d10 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14d20 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
14d30 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
14d40 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
14d50 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14d60 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14d70 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14d80 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14d90 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14da0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14db0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
14dc0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
14dd0 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
14de0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
14df0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
14e00 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
14e10 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14e20 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14e30 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14e40 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14e50 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14e60 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14e70 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14e80 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14e90 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14ea0 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14eb0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
14ec0 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
14ed0 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
14ee0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
14ef0 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
14f00 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
14f10 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14f20 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14f30 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14f40 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14f50 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14f60 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14f80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14f90 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14fa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14fb0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
14fc0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
14fd0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14fe0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
14ff0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
15000 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
15010 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
15020 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15030 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15040 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
15050 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15060 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15070 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15080 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
15090 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
150a0 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
150b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
150c0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
150d0 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
150e0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
150f0 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
15100 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
15110 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
15120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
15130 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
15140 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15150 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
15160 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
15170 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
15180 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
15190 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
151a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
151b0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
151c0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
151d0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
151e0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
151f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15200 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15210 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15220 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15230 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15240 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15250 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15260 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
15270 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15280 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
15290 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
152a0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
152b0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
152c0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
152d0 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
152e0 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
152f0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15300 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15310 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15320 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15330 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15340 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15350 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15360 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15370 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15380 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15390 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
153a0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
153b0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
153c0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
153d0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
153e0 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
153f0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15400 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15410 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15420 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15430 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15440 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
15450 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
15460 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
15470 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
15480 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
15490 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
154a0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
154b0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
154c0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
154d0 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
154e0 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
154f0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15500 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
15510 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
15520 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
15530 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15540 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
15550 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
15560 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
15570 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
15580 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15590 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
155a0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
155b0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
155c0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
155d0 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
155e0 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
155f0 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
15600 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
15610 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
15620 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
15630 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15640 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
15650 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
15660 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
15670 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
15680 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15690 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
156a0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
156b0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
156c0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
156d0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
15700 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
15710 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
15720 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
15730 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
15740 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
15750 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
15760 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
15770 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
15780 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
15790 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
157a0 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
157b0 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
157c0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
157d0 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
157e0 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
157f0 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
15800 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
15810 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
15820 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
15830 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
15840 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
15850 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
15860 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
15870 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
15880 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
15890 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
158a0 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
158b0 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
158c0 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
158d0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
158e0 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
158f0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
15900 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
15910 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
15920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15930 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
15940 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
15950 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
15960 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
15970 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
15980 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
15990 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
159a0 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
159b0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
159c0 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
159d0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
159e0 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
159f0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
15a00 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
15a10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
15a20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
15a30 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
15a40 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
15a50 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
15a60 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
15a70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15a80 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
15a90 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
15aa0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15ab0 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
15ac0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
15ad0 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
15ae0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
15af0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
15b00 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
15b10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
15b20 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
15b30 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
15b40 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
15b50 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
15b60 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
15b70 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
15b80 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
15b90 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
15ba0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15bb0 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
15bc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
15bd0 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
15be0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
15bf0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
15c00 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
15c10 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
15c20 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
15c30 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
15c40 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
15c50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
15c60 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
15c70 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15c80 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15c90 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15ca0 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
15cb0 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
15cc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
15cd0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
15ce0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
15cf0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
15d00 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
15d20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
15d30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15d40 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
15d50 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
15d60 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
15d70 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
15d80 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
15d90 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15da0 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
15db0 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
15dc0 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
15dd0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
15de0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
15df0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
15e00 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
15e10 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
15e20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
15e30 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
15e40 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
15e50 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
15e60 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
15e70 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
15e80 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
15e90 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
15ea0 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
15eb0 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
15ec0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
15ed0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
15ee0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
15ef0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
15f00 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
15f10 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
15f20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15f30 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
15f40 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
15f50 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
15f60 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
15f70 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
15f80 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
15f90 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
15fa0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15fb0 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
15fc0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
15fd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
15fe0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15ff0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
16000 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
16010 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16020 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16030 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
16040 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
16050 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
16060 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
16070 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
16080 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
16090 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
160a0 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
160b0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
160c0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
160d0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
160e0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
160f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16100 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
16110 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
16120 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
16130 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
16140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16150 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
16160 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
16170 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16180 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161a0 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
161b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
161c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
161f0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16200 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16210 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16230 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16240 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
16250 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
16260 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
16270 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16280 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
16290 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
162a0 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
162b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
162c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
162d0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
162e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
162f0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16300 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16310 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16320 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
16330 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
16340 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
16350 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
16360 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
16370 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
16380 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
16390 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
163a0 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
163b0 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
163c0 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
163d0 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
163e0 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
163f0 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
16400 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
16410 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
16420 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
16430 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
16440 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
16450 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
16460 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
16470 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
16480 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
16490 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
164a0 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
164b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
164c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
164d0 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
164e0 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
164f0 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68  t) );..  /* Eith
16500 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20  er the state is 
16510 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47  greater than PAG
16520 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16530 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f  OD (a transactio
16540 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  n .  ** or savep
16550 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f  oint rollback do
16560 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73  ne at the reques
16570 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29  t of the caller)
16580 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   or this is.  **
16590 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
165a0 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69  ollback. If it i
165b0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
165c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61  rollback, the pa
165d0 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73  ger.  ** is in s
165e0 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f  tate OPEN and ho
165f0 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  lds an EXCLUSIVE
16600 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e   lock. Hot-journ
16610 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  al rollback.  **
16620 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d   only reads from
16630 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16640 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a  l, not the sub-j
16650 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
16660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
16670 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
16680 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
16690 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
166a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
166b0 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  EN && pPager->eL
166c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
166d0 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65  OCK).  );.  asse
166e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
166f0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
16700 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d  _CACHEMOD || isM
16710 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a  ainJrnl );..  /*
16720 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e   Read the page n
16730 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64  umber and page d
16740 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ata from the jou
16750 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
16760 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52  nal.  ** file. R
16770 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
16780 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
16790 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  r if an IO error
167a0 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20   occurs..  */.  
167b0 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
167c0 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
167d0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20   pPager->sjfd;. 
167e0 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
167f0 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
16800 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
16810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16820 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
16830 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
16840 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
16850 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
16860 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
16870 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16880 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16890 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
168a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
168b0 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
168c0 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
168d0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
168e0 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
168f0 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
16900 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
16910 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
16920 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
16930 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
16940 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
16950 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
16960 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
16970 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
16980 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
16990 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
169a0 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
169b0 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
169c0 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
169d0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
169e0 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
169f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
16a00 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
16a10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
16a20 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
16a30 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
16a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a50 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
16a60 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
16a70 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
16a80 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
16a90 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
16aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16ab0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16ac0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
16ad0 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
16ae0 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
16af0 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
16b00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16b10 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
16b20 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
16b30 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
16b40 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73  (u8*)aData)!=cks
16b50 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
16b60 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16b80 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73  If this page has
16b90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16ba0 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65  ayed back before
16bb0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16bc0 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16bd0 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16be0 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16bf0 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16c00 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16c10 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16c20 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16c30 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16c40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16c50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16c60 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16c70 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16c80 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16c90 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16ca0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16cb0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16cc0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16cd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16ce0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16cf0 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16d00 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16d10 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16d20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16d30 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16d40 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16d50 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16d60 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16d70 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16d80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16d90 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16da0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16db0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16dc0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16dd0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16de0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16df0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16e00 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16e10 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16e30 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16e40 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16e50 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16e60 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16e70 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16e80 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16e90 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16ea0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16eb0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16ec0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16ed0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16ee0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16ef0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16f00 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16f10 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16f20 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16f30 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16f40 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16f50 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16f60 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16f70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16f80 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16f90 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16fa0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16fb0 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16fc0 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16fd0 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16fe0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16ff0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
17000 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
17010 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
17020 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
17030 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
17040 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
17050 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
17060 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
17070 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
17080 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
17090 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
170a0 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
170b0 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
170c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
170d0 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
170e0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
170f0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
17100 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
17110 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
17120 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
17130 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
17140 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
17150 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
17160 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
17170 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
17180 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
17190 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
171a0 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
171b0 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
171c0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
171d0 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
171e0 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
171f0 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
17200 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
17210 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
17220 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
17230 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
17240 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
17250 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
17260 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
17270 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
17280 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
17290 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
172a0 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
172b0 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
172c0 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
172d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
172e0 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
172f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
17300 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
17310 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
17320 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
17330 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
17340 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
17350 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
17360 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
17370 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
17380 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
17390 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
173a0 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
173b0 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
173c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
173d0 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
173e0 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
173f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17400 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
17410 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
17420 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
17430 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
17440 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
17450 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
17460 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
17470 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
17480 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
17490 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
174a0 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
174b0 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
174c0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
174d0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
174e0 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
174f0 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
17500 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
17510 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
17520 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
17530 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
17540 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
17550 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
17560 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
17570 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
17580 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
17590 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
175a0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
175b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
175c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
175d0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
175e0 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
175f0 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
17600 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
17610 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
17620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
17630 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
17640 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
17650 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
17660 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
17670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
17680 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
17690 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
176a0 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
176b0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
176c0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
176d0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
176e0 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
176f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17700 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17710 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
17720 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
17730 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
17740 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
17750 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
17760 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
17770 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17780 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
17790 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
177a0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
177b0 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
177c0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
177d0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
177e0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
177f0 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
17800 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17810 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17820 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17830 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17840 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17850 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17860 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17870 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
17880 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
17890 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
178a0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
178b0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
178c0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
178d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
178e0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
178f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17900 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17910 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17920 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17930 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17940 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
17950 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
17960 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
17970 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
17980 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
17990 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
179a0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
179b0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
179c0 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  KPT, aData);.   
179d0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
179e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
179f0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
17a00 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
17a10 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
17a20 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
17a30 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
17a40 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17a50 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
17a60 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
17a70 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
17a80 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
17a90 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
17aa0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
17ab0 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
17ac0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
17ad0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
17ae0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
17af0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
17b00 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17b10 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
17b20 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
17b30 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
17b40 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
17b50 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
17b60 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
17b70 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
17b80 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
17b90 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
17ba0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
17bb0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
17bc0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
17bd0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
17be0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
17bf0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17c00 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
17c10 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
17c20 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
17c30 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17c40 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
17c50 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
17c60 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
17c70 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
17c80 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
17c90 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
17ca0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
17cb0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
17cc0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
17cd0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
17ce0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
17cf0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
17d00 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
17d10 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
17d20 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
17d30 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
17d40 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
17d50 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
17d60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
17d70 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
17d80 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
17d90 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
17da0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17db0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
17dc0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
17dd0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
17de0 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
17df0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
17e00 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
17e10 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
17e20 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
17e30 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
17e40 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
17e50 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
17e60 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
17e70 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17e80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17e90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17ea0 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
17eb0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
17ec0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
17ed0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
17ee0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
17ef0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
17f00 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
17f10 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
17f20 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
17f30 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
17f40 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
17f50 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
17f60 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
17f70 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
17f80 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
17f90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
17fa0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
17fb0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
17fc0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
17fd0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
17fe0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
17ff0 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18000 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18010 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18020 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18030 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18040 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18050 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18060 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18070 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18080 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18090 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
180a0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
180b0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
180c0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
180d0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
180e0 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
180f0 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
18100 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
18110 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
18120 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
18130 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
18140 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
18150 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
18160 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
18170 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
18180 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
18190 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
181a0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
181b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
181c0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
181d0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
181e0 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
181f0 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
18200 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
18210 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
18220 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
18230 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
18240 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
18250 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
18260 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
18270 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
18280 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
18290 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
182a0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
182b0 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
182c0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
182d0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
182e0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
182f0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
18300 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
18310 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
18320 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
18330 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
18340 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
18350 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
18360 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
18370 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18380 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
18390 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
183a0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
183b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
183c0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
183d0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
183e0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
183f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18400 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
18410 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
18420 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
18430 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
18440 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
18450 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
18460 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
18470 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
18480 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
18490 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
184a0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
184b0 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
184c0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
184d0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
184e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
184f0 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
18500 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
18510 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
18520 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
18530 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
18540 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
18550 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
18560 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
18570 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
18580 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
18590 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
185a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
185b0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
185c0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
185d0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
185e0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
185f0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
18600 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
18610 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
18620 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
18630 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
18640 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
18650 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
18660 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
18670 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
18680 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
18690 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
186a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
186b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
186c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
186d0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
186e0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
186f0 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
18700 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
18710 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
18720 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
18730 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18740 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
18750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
18770 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
18780 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
18790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
187a0 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
187b0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
187c0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
187d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
187e0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
187f0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
18800 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18810 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
18820 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
18830 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18840 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
18850 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
18860 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
18870 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
18880 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
18890 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
188a0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
188b0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
188c0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
188d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
188e0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
188f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
18900 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
18910 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
18920 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
18930 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
18940 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
18950 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
18960 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
18970 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
18980 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
18990 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
189a0 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
189b0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
189c0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
189d0 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
189e0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
189f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18a00 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
18a10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
18a20 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
18a30 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
18a40 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
18a50 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
18a60 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
18a70 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
18a80 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
18a90 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
18aa0 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
18ab0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
18ac0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
18ad0 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
18ae0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
18af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
18b00 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
18b10 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
18b20 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18b30 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
18b40 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
18b50 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
18b60 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
18b70 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
18b80 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
18b90 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
18ba0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
18bb0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
18bc0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
18bd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18be0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
18bf0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
18c00 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
18c10 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
18c20 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
18c30 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18c40 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18c50 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18c60 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
18c70 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18c80 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
18c90 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
18ca0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
18cb0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
18cc0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18cd0 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
18ce0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
18cf0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
18d00 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
18d10 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
18d20 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
18d30 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
18d40 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
18d50 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18d60 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
18d70 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
18d80 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
18d90 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
18da0 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
18db0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
18dc0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
18dd0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18de0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
18df0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
18e00 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18e10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18e20 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18e30 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18e40 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18e50 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18e60 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
18e70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18e80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18e90 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
18ea0 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
18eb0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
18ec0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18ed0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18ee0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18f00 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18f10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18f20 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18f30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18f40 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18f50 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18f80 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
18f90 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
18fa0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
18fb0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
18fc0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18fd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18fe0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18ff0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
19000 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19010 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
19020 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
19030 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
19040 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
19050 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
19060 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
19070 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19080 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19090 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
190a0 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
190b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
190c0 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
190d0 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
190e0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
190f0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
19100 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
19110 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
19120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19130 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
19140 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
19150 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
19160 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
19170 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
19180 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
19190 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
191a0 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
191b0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
191c0 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
191d0 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
191e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
191f0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
19200 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
19210 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
19220 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
19230 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
19240 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
19250 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
19260 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
19270 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
19280 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
19290 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
192a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
192b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
192c0 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
192d0 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51   flags = .#if SQ
192e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
192f0 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
19300 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
19310 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
19320 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
19330 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
19340 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
19350 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
19360 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
19370 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
19380 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19390 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
193a0 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
193b0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
193c0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
193d0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
193e0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
193f0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
19400 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
19410 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
19420 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  .  ** sqlite3_ma
19430 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
19440 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
19450 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20  Journal.   Also 
19460 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66  obtain.  ** suff
19470 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e  icient space (in
19480 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20   zMasterPtr) to 
19490 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f  hold the names o
194a0 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f  f master.  ** jo
194b0 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72  urnal files extr
194c0 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c  acted from regul
194d0 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  ar rollback-jour
194e0 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nals..  */.  rc 
194f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
19500 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
19510 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
19520 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19530 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19540 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74  ter_out;.  nMast
19550 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
19560 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d  Pathname+1;.  zM
19570 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
19580 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61  qlite3Malloc(nMa
19590 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
195a0 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
195b0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
195c0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
195d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
195e0 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c  PT;.    goto del
195f0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a  master_out;.  }.
19600 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
19610 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
19620 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d  MasterJournal+1]
19630 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19640 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
19650 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
19660 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
19670 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  nal, 0);.  if( r
19680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19690 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
196a0 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  t;.  zMasterJour
196b0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
196c0 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75  al] = 0;..  zJou
196d0 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
196e0 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20  urnal;.  while( 
196f0 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
19700 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
19710 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
19720 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20  int exists;.    
19730 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
19740 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72  cess(pVfs, zJour
19750 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
19760 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
19770 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ts);.    if( rc!
19780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19790 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
197a0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
197b0 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a    if( exists ){.
197c0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
197d0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
197e0 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
197f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
19800 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f  ists..      ** O
19810 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
19820 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
19830 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19840 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  nal. If.      **
19850 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
19860 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
19870 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19880 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
19890 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
198a0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23    int flags = .#
198b0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
198c0 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
198d0 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
198e0 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
198f0 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
19900 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
19910 64 69 66 0a 20 20 20 20 20 20 20 20 28 53 51 4c  dif.        (SQL
19920 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
19930 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
19940 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
19950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19960 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
19970 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
19980 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
19990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
199a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
199b0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
199c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
199d0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
199e0 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
199f0 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
19a00 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
19a10 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19a20 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
19a30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
19a50 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19a60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19a70 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
19a80 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
19a90 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
19aa0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
19ab0 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
19ac0 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
19ad0 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
19ae0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
19af0 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
19b00 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19b10 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19b20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
19b30 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
19b40 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
19b50 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
19b60 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
19b70 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
19b80 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
19b90 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
19ba0 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
19bb0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
19bc0 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
19bd0 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
19be0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
19bf0 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
19c00 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
19c10 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
19c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
19c30 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
19c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19c50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19c60 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
19c70 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
19c80 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
19c90 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
19ca0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
19cb0 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
19cc0 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
19cd0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
19ce0 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
19cf0 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
19d00 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
19d10 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
19d20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
19d30 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
19d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19d50 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68   not open, or th
19d60 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
19d70 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f  n either.** DBMO
19d80 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
19d90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19da0 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
19db0 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a  wise, the size .
19dc0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
19dd0 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  s changed to nPa
19de0 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
19df0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19e00 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20   bytes). .** If 
19e10 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
19e20 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
19e30 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
19e40 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
19e50 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
19e60 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
19e70 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
19e80 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
19e90 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
19ea0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
19eb0 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
19ec0 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
19ed0 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
19ee0 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
19ef0 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
19f00 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
19f10 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
19f20 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
19f30 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
19f40 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
19f50 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
19f60 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
19f70 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
19f80 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
19f90 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
19fa0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
19fb0 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
19fc0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
19fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19fe0 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
19ff0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
1a000 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
1a010 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
1a020 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
1a030 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
1a040 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a050 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
1a060 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a070 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
1a080 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a090 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1a0a0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
1a0b0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
1a0c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1a0d0 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
1a0e0 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
1a0f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a100 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
1a110 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1a120 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1a130 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1a140 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
1a150 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
1a160 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
1a170 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
1a180 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a190 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1a1a0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
1a1b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
1a1c0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
1a1d0 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
1a1e0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
1a1f0 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
1a200 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a210 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1a220 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
1a230 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
1a240 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
1a250 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a260 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
1a270 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
1a280 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
1a290 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
1a2a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1a2b0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1a2c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
1a2d0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
1a2e0 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
1a2f0 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
1a300 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1a310 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
1a320 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1a330 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1a340 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
1a350 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a360 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
1a370 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
1a380 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
1a390 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1a3a0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
1a3b0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1a3c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a3d0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1a3e0 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
1a3f0 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
1a400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a420 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1a430 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1a440 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
1a450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a460 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a470 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
1a480 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
1a490 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
1a4a0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
1a4b0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
1a4c0 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
1a4d0 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
1a4e0 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
1a4f0 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
1a500 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1a510 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1a520 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
1a530 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
1a540 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
1a550 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
1a560 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
1a570 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
1a580 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
1a590 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
1a5a0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
1a5b0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
1a5c0 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
1a5d0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
1a5e0 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
1a5f0 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1a600 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
1a610 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1a620 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
1a630 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
1a640 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
1a650 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1a660 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
1a670 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
1a680 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1a690 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1a6a0 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  l be used .** to
1a6b0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1a6c0 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
1a6d0 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
1a6e0 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
1a6f0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
1a700 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
1a710 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
1a720 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
1a730 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
1a740 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a750 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
1a760 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
1a770 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1a780 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
1a790 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
1a7a0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1a7b0 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
1a7c0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1a7d0 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
1a7e0 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
1a7f0 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
1a800 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
1a810 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
1a820 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
1a830 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
1a840 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
1a850 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a  ECTOR_SIZE..**.*
1a860 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
1a870 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  s the SQLITE_IOC
1a880 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1a890 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c  RWRITE property,
1a8a0 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65   then set.** the
1a8b0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a8c0 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69  r size to its mi
1a8d0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32  nimum value (512
1a8e0 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  ).  The purpose 
1a8f0 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65  of.** pPager->se
1a900 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64  ctorSize is to d
1a910 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74  efine the "blast
1a920 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65   radius" of byte
1a930 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  s that.** might 
1a940 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73  change if a cras
1a950 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77  h occurs while w
1a960 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  riting to a sing
1a970 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68  le byte in.** th
1a980 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77  at range.  But w
1a990 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ith POWERSAFE_OV
1a9a0 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61  ERWRITE, the bla
1a9b0 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72  st radius is zer
1a9c0 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68  o.** (that is wh
1a9d0 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  at POWERSAFE_OVE
1a9e0 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73  RWRITE means), s
1a9f0 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  o we minimize th
1aa00 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65  e sector.** size
1aa10 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  .  For backwards
1aa20 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
1aa30 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1aa40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1aa50 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74  at,.** we cannot
1aa60 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1aa70 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1aa80 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a  e below 512..*/.
1aa90 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
1aaa0 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
1aab0 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
1aac0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1aad0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1aae0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
1aaf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
1ab00 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c  pFile.   || (sql
1ab10 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1ab20 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1ab30 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20  er->fd) & .     
1ab40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ab50 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1ab60 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20  OVERWRITE)!=0.  
1ab70 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
1ab80 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
1ab90 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
1aba0 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
1abb0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1abc0 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
1abd0 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
1abe0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
1abf0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
1ac00 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
1ac10 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20  segfault. */.   
1ac20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1ac30 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  ize = 512;.  }el
1ac40 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
1ac50 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
1ac60 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70  ite3SectorSize(p
1ac70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
1ac80 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
1ac90 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
1aca0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
1acb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1acc0 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
1acd0 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
1ace0 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
1acf0 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
1ad00 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
1ad10 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
1ad20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
1ad30 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
1ad40 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
1ad50 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
1ad60 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
1ad70 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1ad80 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1ad90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
1ada0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
1adb0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
1adc0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
1add0 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
1ade0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
1adf0 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
1ae00 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
1ae10 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1ae20 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
1ae30 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
1ae40 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1ae50 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1ae60 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
1ae70 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
1ae80 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
1ae90 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
1aea0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1aeb0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1aec0 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
1aed0 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
1aee0 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
1aef0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
1af00 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
1af10 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1af20 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
1af30 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
1af40 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
1af50 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
1af60 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
1af70 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
1af80 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1af90 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
1afa0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
1afb0 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
1afc0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
1afd0 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
1afe0 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
1aff0 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
1b000 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
1b010 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
1b020 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
1b030 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
1b040 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b050 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
1b060 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1b070 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
1b080 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
1b090 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b0a0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
1b0b0 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
1b0c0 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
1b0d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
1b0e0 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
1b0f0 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
1b100 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
1b110 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
1b120 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
1b130 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
1b140 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b150 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
1b160 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
1b170 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
1b180 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
1b190 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
1b1a0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
1b1b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b1c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b1d0 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
1b1e0 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
1b1f0 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
1b200 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
1b210 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
1b220 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
1b230 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
1b240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b250 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
1b260 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
1b270 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
1b280 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
1b290 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
1b2a0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
1b2b0 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
1b2c0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1b2d0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
1b2e0 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
1b2f0 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
1b300 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
1b310 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
1b320 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
1b330 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
1b340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
1b350 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
1b360 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
1b370 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
1b380 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
1b390 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1b3a0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
1b3b0 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
1b3c0 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
1b3d0 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
1b3e0 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
1b3f0 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
1b400 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
1b410 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
1b420 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
1b430 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
1b440 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
1b450 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
1b460 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
1b470 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
1b480 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
1b490 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
1b4a0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
1b4b0 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
1b4c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1b4d0 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
1b4e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1b4f0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
1b500 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
1b510 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
1b520 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
1b530 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
1b540 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1b550 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
1b560 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b570 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
1b580 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
1b590 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
1b5a0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
1b5b0 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
1b5c0 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
1b5d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
1b5e0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1b5f0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
1b600 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
1b610 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
1b620 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1b630 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1b640 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
1b650 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
1b660 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
1b670 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1b680 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1b690 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1b6a0 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1b6b0 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1b6c0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1b6d0 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1b6e0 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1b6f0 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1b700 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1b710 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1b720 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1b730 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1b740 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1b750 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1b760 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1b770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b780 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1b790 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1b7a0 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1b7b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1b7c0 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1b7d0 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1b7e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1b7f0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1b800 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b830 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1b840 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1b850 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1b860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b870 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1b880 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1b890 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1b8a0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1b8b0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1b8c0 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1b8d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1b8e0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1b8f0 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1b900 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1b930 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1b940 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1b950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b960 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1b970 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1b980 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1b990 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1b9a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1b9b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1b9c0 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1b9d0 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1b9e0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1b9f0 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1ba00 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1ba10 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   rollback */.  i
1ba20 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30  nt nPlayback = 0
1ba30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ;       /* Total
1ba40 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ba50 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a   restored from j
1ba60 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ournal */..  /* 
1ba70 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1ba80 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1ba90 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1baa0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1bab0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1bac0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1bad0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1bae0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1baf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1bb00 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1bb10 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1bb20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bb30 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1bb40 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1bb50 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1bb60 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1bb70 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1bb80 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1bb90 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1bba0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bbb0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1bbc0 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1bbd0 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1bbe0 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1bbf0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1bc00 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1bc10 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1bc20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1bc30 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1bc40 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1bc50 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1bc60 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1bc70 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1bc80 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1bc90 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1bca0 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1bcb0 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1bcc0 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1bcd0 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1bce0 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1bcf0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1bd00 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1bd10 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61  nix.c,.  ** mxPa
1bd20 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1bd30 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1bd40 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1bd50 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1bd60 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1bd70 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1bd80 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1bd90 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1bda0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1bdb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1bdc0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1bdd0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1bde0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bdf0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1be00 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1be10 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1be20 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1be30 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1be40 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1be50 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1be60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1be70 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1be80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1be90 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1bea0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1beb0 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1bec0 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1bed0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1bee0 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1bef0 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1bf00 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1bf10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1bf20 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1bf30 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1bf40 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1bf50 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1bf60 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1bf70 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1bf80 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1bf90 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1bfa0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1bfb0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1bfc0 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1bfd0 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1bfe0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1bff0 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1c000 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1c010 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1c020 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1c030 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c040 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1c050 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1c060 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1c070 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1c080 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1c090 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1c0a0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1c0b0 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1c0c0 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1c0d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c0e0 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1c0f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c100 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1c130 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c150 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1c160 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1c170 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1c180 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1c190 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1c1a0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1c1b0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1c1c0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1c1d0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1c1e0 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1c1f0 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1c200 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1c210 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1c220 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1c230 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1c240 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1c250 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1c260 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1c270 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1c280 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1c290 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1c2a0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c2b0 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1c2c0 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1c2d0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c2e0 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1c2f0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1c300 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c310 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1c320 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1c330 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1c340 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1c350 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1c360 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1c370 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1c380 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1c390 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1c3a0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1c3b0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1c3c0 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1c3d0 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1c3e0 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1c3f0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1c400 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1c410 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1c420 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1c430 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1c440 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1c450 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1c460 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1c470 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1c480 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1c490 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1c4a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1c4b0 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1c4c0 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1c4d0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1c4e0 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1c4f0 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1c500 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1c510 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1c520 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1c530 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1c540 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1c550 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1c560 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1c570 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1c580 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1c590 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1c5a0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1c5b0 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1c5c0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1c5d0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1c5e0 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1c5f0 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1c600 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1c610 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1c620 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c630 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1c640 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1c650 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1c660 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c670 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1c680 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1c690 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c6a0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1c6b0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1c6c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c6d0 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1c6e0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1c6f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1c700 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1c710 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1c720 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1c730 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1c740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1c750 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1c760 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1c770 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1c780 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1c790 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1c7a0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1c7b0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1c7c0 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1c7d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c7e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c7f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c800 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1c810 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c820 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1c830 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1c840 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1c850 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c860 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1c870 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1c880 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1c890 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1c8a0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1c8b0 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1c8c0 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1c8d0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1c8e0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1c8f0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1c900 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1c910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c920 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1c930 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1c940 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1c950 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1c960 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c980 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a     nPlayback++;.
1c990 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c9a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c9b0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1c9c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1c9d0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1c9e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c9f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1ca00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1ca10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1ca20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1ca30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1ca40 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1ca50 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1ca60 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1ca70 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1ca80 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1ca90 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1caa0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1cab0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1cac0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1cad0 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1cae0 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1caf0 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1cb00 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1cb10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1cb20 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1cb30 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1cb40 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1cb50 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1cb60 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1cb70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1cb80 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1cb90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cba0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1cbb0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1cbc0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1cbd0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1cbe0 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1cbf0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1cc00 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1cc10 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1cc20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1cc30 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1cc40 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1cc50 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1cc60 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1cc70 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1cc80 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1cc90 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1cca0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1ccb0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1ccc0 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1ccd0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1cce0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1ccf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1cd00 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1cd10 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1cd20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cd30 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1cd40 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1cd50 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1cd60 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1cd70 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1cd80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1cd90 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1cda0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1cdb0 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1cdc0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1cdd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1cde0 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1cdf0 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1ce00 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1ce10 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1ce20 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1ce30 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1ce40 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1ce50 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1ce60 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1ce70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1ce80 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1ce90 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1cea0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1ceb0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1cec0 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1ced0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1cee0 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1cef0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1cf00 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1cf10 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1cf20 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1cf30 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1cf40 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1cf50 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1cf60 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1cf70 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1cf80 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1cf90 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1cfa0 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1cfb0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1cfc0 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1cfd0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1cfe0 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1cff0 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1d000 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1d010 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1d020 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1d030 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1d040 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1d050 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1d060 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1d070 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d080 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1d090 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1d0a0 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1d0b0 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1d0c0 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1d0d0 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1d0e0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1d0f0 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1d100 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1d110 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1d120 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1d130 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1d140 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1d150 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1d160 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1d170 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1d190 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1d1a0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1d1b0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1d1c0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1d1d0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1d1e0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1d1f0 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1d200 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d210 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d220 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1d230 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1d240 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1d250 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1d260 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1d270 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1d280 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d290 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1d2a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d2c0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1d2d0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1d2e0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1d2f0 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1d300 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1d310 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1d320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d330 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1d340 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1d350 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1d360 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1d370 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1d380 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1d390 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1d3a0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1d3b0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1d3c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1d3d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1d3e0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1d3f0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1d400 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1d410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1d420 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1d430 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1d440 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1d450 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1d460 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1d470 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1d480 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1d4a0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1d4b0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1d4c0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1d4d0 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1d4e0 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1d4f0 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1d500 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1d510 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1d520 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1d530 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1d540 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1d550 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1d560 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1d570 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1d580 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1d590 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1d5a0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1d5b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1d5c0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1d5d0 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1d5e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d5f0 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1d600 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1d610 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1d620 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1d630 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1d640 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1d650 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1d660 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1d670 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1d680 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1d690 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1d6a0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1d6b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1d6c0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1d6d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d6e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1d6f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1d700 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1d710 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1d720 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1d730 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1d740 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1d750 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1d760 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1d770 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1d780 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d790 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1d7a0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1d7b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1d7c0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1d7d0 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1d7e0 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1d7f0 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1d800 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1d810 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1d820 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1d830 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1d840 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1d850 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1d860 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1d870 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d880 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d890 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1d8a0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1d8b0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1d8c0 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  fd) );..#ifndef 
1d8d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1d8e0 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1d8f0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1d900 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1d910 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1d920 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1d930 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1d940 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1d950 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1d960 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1d970 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1d980 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1d990 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1d9a0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1d9b0 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1d9c0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1d9d0 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1d9e0 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1d9f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1da00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1da10 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1da20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1da30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1da40 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1da50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1da60 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1da70 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1da80 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1da90 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1daa0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1dab0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1dac0 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1dad0 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1dae0 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1daf0 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1db00 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1db10 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1db20 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1db30 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1db40 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1db50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1db60 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1db70 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1db80 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1db90 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1dba0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1dbb0 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1dbc0 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1dbd0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1dbe0 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1dbf0 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1dc00 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1dc10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1dc20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1dc30 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1dc40 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1dc50 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1dc60 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1dc70 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1dc80 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1dc90 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1dca0 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1dcb0 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c  hite noise equal
1dcc0 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1dcd0 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1dce0 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1dcf0 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1dd00 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1dd10 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1dd20 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1dd30 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1dd40 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1dd50 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1dd60 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1dd70 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1dd80 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1dd90 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1dda0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1ddb0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1ddc0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1ddd0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1dde0 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1ddf0 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1de00 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1de10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1de20 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52  _BKPT);..  PAGER
1de30 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1de40 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1de50 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1de60 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1de70 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1de80 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1de90 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1dea0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1deb0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1dec0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1ded0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1dee0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1def0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1df00 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1df10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1df20 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1df30 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1df40 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1df50 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1df60 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1df70 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1df80 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1df90 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1dfa0 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1dfb0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1dfc0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1dfd0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1dfe0 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1dff0 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1e000 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1e010 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1e020 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1e030 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1e040 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1e050 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1e060 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1e070 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1e080 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1e090 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1e0a0 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1e0b0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1e0c0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1e0d0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1e0e0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1e0f0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1e100 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1e110 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1e120 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1e130 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1e140 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1e150 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1e160 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1e170 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1e180 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1e190 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1e1a0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1e1b0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1e1c0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1e1d0 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1e1e0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1e1f0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1e200 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1e210 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1e220 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1e230 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1e240 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1e250 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1e260 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e270 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1e280 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1e290 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1e2a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1e2b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e2c0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1e2d0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1e2e0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1e2f0 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1e300 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1e310 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1e320 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1e330 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1e340 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1e350 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e360 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1e370 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1e380 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1e390 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1e3a0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1e3b0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1e3c0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1e3d0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1e3e0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1e3f0 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1e400 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1e410 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e420 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1e430 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1e440 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1e450 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1e460 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1e470 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1e480 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1e490 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1e4a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1e4b0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1e4c0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1e4d0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1e4e0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1e4f0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1e500 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1e510 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1e520 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1e530 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1e540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e550 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e560 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1e570 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1e580 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e590 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e5a0 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1e5b0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1e5c0 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1e5d0 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1e5e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1e5f0 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1e600 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1e610 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1e620 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e630 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1e640 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1e650 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e660 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e670 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e680 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1e690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e6a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1e6b0 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1e6c0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1e6d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e6e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e6f0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1e700 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1e710 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1e720 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1e730 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1e740 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1e750 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1e760 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1e770 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1e780 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1e790 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1e7a0 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1e7b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e7c0 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1e7d0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1e7e0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1e7f0 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1e800 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1e810 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1e820 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1e830 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1e840 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1e850 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1e860 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1e870 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1e880 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1e890 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1e8a0 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1e8b0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1e8c0 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1e8d0 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1e8e0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1e8f0 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1e900 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1e910 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1e920 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1e930 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1e940 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1e950 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e970 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1e980 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1e990 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1e9a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e9b0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e9c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e9d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1ea00 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1ea10 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1ea20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1ea30 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1ea40 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1ea50 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1ea60 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1ea70 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1ea80 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1ea90 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1eaa0 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1eab0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1eac0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1ead0 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1eae0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1eaf0 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1eb00 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1eb10 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1eb20 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1eb30 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1eb40 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1eb50 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1eb60 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1eb70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1eb80 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1eb90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1eba0 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1ebb0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1ebc0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1ebd0 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1ebe0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1ebf0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1ec00 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1ec10 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1ec20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ec30 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1ec40 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1ec50 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1ec60 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1ec70 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1ec80 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1ec90 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1eca0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1ecb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ecc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1ecd0 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1ece0 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1ecf0 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1ed00 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1ed10 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1ed20 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1ed30 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1ed40 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1ed50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1ed60 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1ed70 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1ed80 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1ed90 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1eda0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1edb0 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1edc0 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1edd0 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1ede0 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1edf0 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1ee00 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1ee10 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1ee20 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1ee30 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1ee40 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1ee50 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1ee60 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1ee70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1ee80 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1ee90 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1eea0 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1eeb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1eec0 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1eed0 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1eee0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1eef0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1ef00 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1ef10 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1ef20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1ef50 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1ef60 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1ef90 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1efa0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1efb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1efc0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1efd0 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1efe0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1eff0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1f000 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1f010 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1f020 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1f030 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1f040 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1f050 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1f060 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1f070 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1f080 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1f090 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1f0a0 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1f0b0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1f0c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1f0d0 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1f0e0 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1f0f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1f100 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1f110 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1f120 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1f130 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1f140 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1f150 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1f160 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1f170 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1f180 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1f190 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1f1a0 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1f1b0 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1f1c0 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1f1d0 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1f1e0 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1f1f0 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1f200 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1f210 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1f220 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1f230 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26  Hdr **ppNext = &
1f240 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74  pList;.    nList
1f250 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 0;.    for(p=
1f260 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1f270 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44  = p)!=0; p=p->pD
1f280 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28  irty){.      if(
1f290 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63   p->pgno<=nTrunc
1f2a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
1f2b0 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1f2c0 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73  ty;.        nLis
1f2d0 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
1f2e0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1f2f0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
1f300 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a  .    nList = 1;.
1f310 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53    }.  pPager->aS
1f320 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
1f330 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a  RITE] += nList;.
1f340 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1f350 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
1f360 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1f370 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d  r(pList);.  rc =
1f380 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1f390 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  s(pPager->pWal, 
1f3a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1f3b0 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20  ageSize, pList, 
1f3c0 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d  nTruncate, isCom
1f3d0 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c  mit, pPager->wal
1f3e0 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20  SyncFlags.  );. 
1f3f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f400 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42  OK && pPager->pB
1f410 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72  ackup ){.    for
1f420 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f430 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1f440 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1f450 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1f460 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1f470 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1f480 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1f490 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1f4a0 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73  AGES.  pList = s
1f4b0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1f4c0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1f4d0 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Cache);.  for(p=
1f4e0 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1f4f0 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65  Dirty){.    page
1f500 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
1f510 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1f520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f530 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61  *.** Begin a rea
1f540 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
1f550 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20   the WAL..**.** 
1f560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1f570 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22  d to be called "
1f580 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
1f590 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20  t()" because it 
1f5a0 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  essentially.** m
1f5b0 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20  akes a snapshot 
1f5c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f5d0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1f5e0 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64  oint in time and
1f5f0 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68   preserves.** th
1f600 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20  at snapshot for 
1f610 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65  use by the reade
1f620 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f  r in spite of co
1f630 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67  ncurrently chang
1f640 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77  es by.** other w
1f650 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70  riters or checkp
1f660 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
1f670 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69  ic int pagerBegi
1f680 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1f690 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f6a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1f6d0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
1f6e0 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1f6f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f700 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
1f710 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
1f720 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1f730 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
1f740 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f750 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f760 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1f770 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
1f780 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  );..  /* sqlite3
1f790 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1f7a0 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20  ction() was not 
1f7b0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70  called for the p
1f7c0 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61  revious.  ** tra
1f7d0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b  nsaction in lock
1f7e0 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
1f7f0 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20  VE.  So call it 
1f800 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  now.  If we.  **
1f810 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   are in locking_
1f820 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20  mode=NORMAL and 
1f830 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72  EndRead() was pr
1f840 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c  eviously called,
1f850 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63  .  ** the duplic
1f860 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d  ate call is harm
1f870 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  less..  */.  sql
1f880 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1f890 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1f8a0 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pWal);..  rc =
1f8b0 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
1f8c0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f8d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63  pPager->pWal, &c
1f8e0 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72  hanged);.  if( r
1f8f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1f900 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70  changed ){.    p
1f910 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1f920 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46  r);.    if( USEF
1f930 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
1f940 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
1f950 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
1f960 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1f970 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1f980 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f990 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
1f9a0 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  part of the tran
1f9b0 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45  sition from PAGE
1f9c0 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47  R_OPEN.** to PAG
1f9d0 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20  ER_READER state 
1f9e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1f9f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1fa00 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e  abase file.** in
1fa10 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67   pages (assuming
1fa20 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
1fa30 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
1fa40 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  in Pager.pageSiz
1fa50 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  e)..**.** If no 
1fa60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
1fa70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1fa80 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65  ned and the size
1fa90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1faa0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20  .** in pages is 
1fab0 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67  stored in *pnPag
1fac0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  e. Otherwise, an
1fad0 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72   error code (per
1fae0 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  haps.** SQLITE_I
1faf0 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72  OERR_FSTAT) is r
1fb00 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1fb10 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  age is left unmo
1fb20 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  dified..*/.stati
1fb30 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63  c int pagerPagec
1fb40 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
1fb50 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65  er, Pgno *pnPage
1fb60 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1fb90 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50   return via *pnP
1fba0 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65  age */..  /* Que
1fbb0 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  ry the WAL sub-s
1fbc0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61  ystem for the da
1fbd0 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65  tabase size. The
1fbe0 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a   WalDbsize().  *
1fbf0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1fc00 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57  ns zero if the W
1fc10 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28  AL is not open (
1fc20 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d  i.e. Pager.pWal=
1fc30 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20  =0), or.  ** if 
1fc40 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1fc50 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1fc60 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  le. The database
1fc70 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a   size is not.  *
1fc80 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  * available from
1fc90 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1fca0 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66  tem if the log f
1fcb0 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a  ile is empty or.
1fcc0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
1fcd0 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64   valid committed
1fce0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20   transactions.. 
1fcf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1fd00 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fd10 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1fd20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1fd30 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1fd40 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1fd50 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1fd60 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1fd70 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   /* If the numbe
1fd80 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fd90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1fda0 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1fdb0 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75   the.  ** WAL su
1fdc0 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d  b-system, determ
1fdd0 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75  ine the page cou
1fde0 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  nte based on the
1fdf0 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68   size of.  ** th
1fe00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fe10 20 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66    If the size of
1fe20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fe30 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a  le is not an.  *
1fe40 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  * integer multip
1fe50 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
1fe60 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68  ize, round up th
1fe70 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
1fe80 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1fe90 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1fec0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1fed0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
1fee0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1fef0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1ff00 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1ff10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ff20 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  d) ){.      int 
1ff30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1ff40 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1ff50 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  d, &n);.      if
1ff60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ff80 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1ff90 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
1ffa0 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
1ffb0 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
1ffc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ffd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1ffe0 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1fff0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
20000 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
20010 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
20020 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
20030 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
20040 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
20050 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
20060 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
20070 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
20080 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20090 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
200a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
200b0 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
200c0 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
200d0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
200e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
200f0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
20100 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
20110 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
20120 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
20130 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
20140 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
20150 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
20160 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
20170 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20180 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
20190 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
201a0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
201b0 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
201c0 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
201d0 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
201e0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
201f0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20200 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
20210 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
20220 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
20230 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20240 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20250 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
20260 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
20270 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20280 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20290 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
202a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
202b0 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
202c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
202d0 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
202e0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
202f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20300 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20310 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
20320 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20330 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20340 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
20350 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
20360 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20370 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20380 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20390 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
203a0 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
203b0 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
203c0 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
203d0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
203e0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
203f0 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
20400 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
20410 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
20420 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
20430 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20440 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20450 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
20460 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20470 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20480 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20490 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
204a0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
204b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
204c0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
204d0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
204e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
204f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
20500 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20510 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20520 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
20530 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
20540 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20550 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20570 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
20580 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
20590 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
205a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
205b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
205c0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
205d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
205e0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
205f0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
20600 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
20610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
20620 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
20630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20640 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
20650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20670 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20680 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20690 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
206a0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
206b0 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
206c0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
206d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
206e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
206f0 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
20700 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
20710 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
20720 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20730 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
20740 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20750 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
20760 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
20770 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
20780 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
20790 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
207a0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
207b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
207c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
207d0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
207e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
207f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20800 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
20810 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
20820 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
20830 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
20840 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
20850 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
20860 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20870 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
20880 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
20890 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
208a0 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
208b0 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
208c0 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
208d0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
208e0 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
208f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
20900 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
20910 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
20920 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
20930 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
20940 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
20950 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
20960 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
20970 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
20980 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
20990 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
209a0 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
209b0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
209c0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
209d0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
209e0 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
209f0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
20a00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20a10 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20a20 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
20a30 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20a40 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
20a50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20a60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
20a70 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
20a80 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20a90 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
20aa0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
20ab0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20ac0 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
20ad0 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
20ae0 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
20af0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
20b00 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
20b10 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
20b20 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
20b30 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
20b40 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
20b50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20b60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
20b70 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
20b80 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
20b90 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20ba0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
20bb0 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
20bc0 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
20bd0 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
20be0 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
20bf0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
20c00 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
20c10 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
20c20 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
20c30 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
20c40 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
20c50 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
20c60 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
20c70 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
20c80 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
20c90 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
20ca0 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
20cb0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20cc0 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
20cd0 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
20ce0 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
20cf0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
20d00 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
20d10 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
20d20 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
20d30 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
20d40 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
20d50 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
20d60 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
20d70 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20d80 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20d90 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
20da0 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
20db0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
20dc0 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
20dd0 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
20de0 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
20df0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
20e00 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
20e10 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
20e20 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
20e30 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
20e40 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
20e50 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
20e60 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
20e70 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
20e80 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
20e90 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
20ea0 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
20eb0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
20ec0 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
20ed0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20ee0 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
20ef0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
20f00 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
20f10 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
20f20 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
20f50 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
20f60 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
20f70 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
20f80 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
20f90 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
20fa0 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
20fb0 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
20fc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
20fd0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20fe0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
20ff0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
21000 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
21010 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
21020 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
21030 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21040 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
21050 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
21060 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21070 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
21080 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
21090 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
210a0 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
210b0 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
210c0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
210d0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
210e0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
210f0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
21100 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
21110 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
21120 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
21130 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21140 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
21150 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
21160 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
21170 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
21180 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
21190 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
211a0 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
211b0 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
211c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
211d0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
211e0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
211f0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
21200 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
21210 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
21220 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
21230 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
21240 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
21250 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
21260 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21270 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
21280 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
21290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
212a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
212b0 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
212c0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
212d0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
212e0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
212f0 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
21300 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
21310 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
21320 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21330 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
21340 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
21350 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
21360 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
21370 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21380 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
21390 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
213a0 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
213b0 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
213c0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
213d0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
213e0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
213f0 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
21400 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
21410 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21420 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
21430 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21440 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
21450 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
21460 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
21470 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
21480 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
21490 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
214a0 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
214b0 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
214c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
214d0 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
214e0 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
214f0 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
21500 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
21510 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
21520 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
21530 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
21540 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
21550 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
21560 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21570 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
21580 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21590 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
215a0 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
215b0 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
215c0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
215d0 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
215e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
215f0 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
21600 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
21610 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21620 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21630 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
21640 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21650 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21660 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21670 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21680 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21690 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
216a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
216b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
216c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
216d0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
216e0 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
216f0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
21700 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21710 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21720 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
21730 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
21740 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
21750 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
21760 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
21770 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21780 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
21790 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
217a0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
217b0 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
217c0 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
217d0 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
217e0 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
217f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21800 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21810 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
21820 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
21830 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21840 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
21850 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
21860 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
21870 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
21880 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
21890 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
218a0 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
218b0 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
218c0 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
218d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
218e0 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
218f0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
21900 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
21910 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21920 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21930 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
21940 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
21950 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
21960 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
21970 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
21980 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
21990 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
219a0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
219b0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
219c0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
219d0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
219e0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
219f0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21a00 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21a10 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
21a20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
21a30 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
21a40 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
21a50 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
21a60 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
21a70 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
21a80 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
21a90 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
21aa0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
21ab0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
21ac0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21ad0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21ae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21af0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
21b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21b10 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21b20 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
21b30 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21b40 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
21b50 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
21b60 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
21b70 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
21b80 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
21b90 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
21ba0 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
21bb0 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
21bc0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
21bd0 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
21be0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
21bf0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
21c00 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
21c10 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
21c20 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
21c30 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21c40 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
21c50 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
21c60 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21c70 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
21c80 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69   = (i64)pSavepoi
21c90 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
21ca0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21cb0 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
21cc0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21cd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21ce0 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
21cf0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
21d00 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
21d10 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
21d20 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
21d30 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
21d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21d50 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
21d60 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
21d70 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
21d80 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61  ==(i64)ii*(4+pPa
21d90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
21da0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
21db0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21dc0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
21dd0 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
21de0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21df0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21e00 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
21e10 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
21e20 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
21e30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21e40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21e50 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
21e60 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
21e70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
21e80 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
21e90 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
21ea0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
21eb0 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
21ec0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
21ed0 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e  to recycle clean
21ee0 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65   and unused page
21ef0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
21f00 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21f10 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21f20 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21f30 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21f40 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
21f50 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
21f60 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  age);.}../*.** C
21f70 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21f80 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
21f90 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
21fa0 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
21fb0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
21fc0 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73  g to spill pages
21fd0 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a   to journal..*/.
21fe0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21ff0 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67  SetSpillsize(Pag
22000 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
22010 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  mxPage){.  retur
22020 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  n sqlite3PcacheS
22030 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67  etSpillsize(pPag
22040 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
22050 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
22060 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
22070 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
22080 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
22090 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
220a0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
220b0 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
220c0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
220d0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
220e0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
220f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
22100 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
22110 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
22120 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
22130 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
22140 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
22150 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
22160 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
22170 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
22180 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
22190 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
221a0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
221b0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
221c0 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
221d0 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  &sz);.  }.#endif
221e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
221f0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
22200 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20  e of any memory 
22210 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20  mapping made of 
22220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22230 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22240 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
22250 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
22260 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
22270 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67   szMmap){.  pPag
22280 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d  er->szMmap = szM
22290 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d  map;.  pagerFixM
222a0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
222b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
222c0 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
222d0 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
222e0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69  he pager..*/.voi
222f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  d sqlite3PagerSh
22300 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67  rink(Pager *pPag
22310 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
22320 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65  acheShrink(pPage
22330 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
22340 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74  /*.** Adjust set
22350 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  tings of the pag
22360 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  er to those spec
22370 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46  ified in the pgF
22380 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a  lags parameter..
22390 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c  **.** The "level
223a0 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50  " in pgFlags & P
223b0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
223c0 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72  _MASK sets the r
223d0 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20  obustness.** of 
223e0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
223f0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
22400 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65   crashes or powe
22410 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a  r failures by.**
22420 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
22430 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
22440 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68   when writing th
22450 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  e journals..** T
22460 68 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65  here are four le
22470 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
22480 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
22490 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
224a0 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
224b0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
224c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
224d0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
224e0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
224f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
22500 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
22510 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
22520 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
22530 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
22540 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
22550 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
22560 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
22570 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
22580 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22590 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
225a0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
225b0 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
225c0 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
225d0 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
225e0 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
225f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
22600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
22620 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
22630 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
22640 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
22650 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22660 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
22670 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
22680 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
22690 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
226a0 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
226b0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
226c0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
226d0 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
226e0 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
226f0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
22700 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
22710 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
22720 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
22730 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
22740 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
22750 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
22760 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
22770 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
22780 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
227a0 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
227b0 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
227c0 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
227d0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
227e0 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
227f0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
22800 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
22810 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
22820 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
22830 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
22840 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
22850 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
22860 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54  ck..**.**    EXT
22870 52 41 20 20 20 20 20 54 68 69 73 20 69 73 20 6c  RA     This is l
22880 69 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20  ike FULL except 
22890 74 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e  that is also syn
228a0 63 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  cs the directory
228b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
228c0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
228d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
228e0 6e 61 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f  nal after the ro
228f0 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20  llback.**       
22900 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69         journal i
22910 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a  s unlinked..**.*
22920 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
22930 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
22940 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
22950 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
22960 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
22970 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
22980 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
22990 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
229a0 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
229b0 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
229c0 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
229d0 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
229e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
229f0 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
22a00 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
22a10 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
22a20 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
22a30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
22a40 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
22a50 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
22a60 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
22a70 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
22a80 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
22a90 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
22aa0 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
22ab0 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
22ac0 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
22ad0 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
22ae0 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
22af0 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
22b00 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
22b10 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
22b20 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
22b30 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65  ith NORMAL.  The
22b40 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65  re is no differe
22b50 6e 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c  nce between FULL
22b60 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f  .** and EXTRA fo
22b70 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  r WAL mode..**.*
22b80 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
22b90 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
22ba0 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
22bb0 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
22bc0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22bd0 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
22be0 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
22bf0 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
22c00 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
22c10 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
22c20 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22c30 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
22c40 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
22c50 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
22c60 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
22c70 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
22c80 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
22c90 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
22ca0 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
22cb0 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
22cc0 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
22cd0 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
22ce0 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
22cf0 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
22d00 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
22d10 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
22d20 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
22d30 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
22d40 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
22d50 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
22d60 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
22d70 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22d80 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
22d90 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
22da0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
22db0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22dc0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
22dd0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
22de0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20  PagerSetFlags(. 
22df0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22e00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22e10 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74  ger to set safet
22e20 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20  y level for */. 
22e30 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
22e40 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  s      /* Variou
22e50 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  s flags */.){.  
22e60 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d  unsigned level =
22e70 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22e80 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
22e90 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
22ea0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
22eb0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
22ec0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
22ed0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20  >fullSync = 0;. 
22ee0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
22ef0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
22f00 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
22f10 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
22f20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
22f30 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20  S_OFF ?1:0;.    
22f40 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
22f50 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f   = level>=PAGER_
22f60 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c  SYNCHRONOUS_FULL
22f70 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65   ?1:0;.    pPage
22f80 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c  r->extraSync = l
22f90 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43  evel==PAGER_SYNC
22fa0 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31  HRONOUS_EXTRA ?1
22fb0 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  :0;.  }.  if( pP
22fc0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
22fd0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22fe0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  Flags = 0;.    p
22ff0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
23000 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
23010 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
23020 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20  PAGER_FULLFSYNC 
23030 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
23040 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
23050 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20  E_SYNC_FULL;.   
23060 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
23070 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23080 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
23090 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
230a0 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c   PAGER_CKPT_FULL
230b0 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
230c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
230d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
230e0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
230f0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
23100 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
23110 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
23120 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23130 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23140 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
23150 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
23160 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23170 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50  NORMAL;.  }.  pP
23180 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
23190 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  gs = pPager->syn
231a0 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50  cFlags;.  if( pP
231b0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
231c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  {.    pPager->wa
231d0 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41  lSyncFlags |= WA
231e0 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
231f0 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONS;.  }.  if( p
23200 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
23210 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20  ACHESPILL ){.   
23220 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
23230 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
23240 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a  G_OFF;.  }else{.
23250 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
23260 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46  tSpill |= SPILLF
23270 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23  LAG_OFF;.  }.}.#
23280 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
23290 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
232a0 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
232b0 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
232c0 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
232d0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
232e0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
232f0 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
23300 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
23310 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
23320 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
23330 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
23340 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
23350 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
23360 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
23370 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
23380 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
23390 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
233a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
233b0 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
233c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
233d0 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
233e0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
233f0 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
23400 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
23410 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
23420 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
23430 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
23440 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
23450 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
23460 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
23470 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
23480 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
23490 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
234a0 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
234b0 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
234c0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
234d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
234e0 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
234f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
23500 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
23510 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
23520 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23530 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
23540 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
23550 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
23560 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23570 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
23580 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
23590 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
235a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
235b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
235c0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
235d0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
235e0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
235f0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
23600 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
23610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23620 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23630 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
23640 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
23650 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
23660 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
23670 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
23680 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
23690 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
236a0 3d 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  =  .#if SQLITE_E
236b0 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
236c0 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  CTION.          
236d0 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
236e0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
236f0 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
23700 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
23710 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23720 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
23730 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
23740 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
23750 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
23760 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
23770 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
23780 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
23790 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
237a0 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
237b0 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
237c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
237d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
237e0 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
237f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23800 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
23810 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
23820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
23830 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
23840 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
23850 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
23860 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
23870 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
23880 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
23890 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
238a0 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
238b0 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
238c0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
238d0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
238e0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
238f0 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
23900 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
23910 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
23920 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
23930 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
23940 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
23950 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
23960 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
23970 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
23980 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
23990 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
239a0 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
239b0 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239d0 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
239e0 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
239f0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
23a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
23a30 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
23a40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
23a50 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
23a60 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
23a70 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
23a80 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
23a90 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
23aa0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
23ab0 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
23ac0 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
23ad0 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
23ae0 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
23af0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
23b00 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
23b10 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
23b20 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
23b30 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
23b40 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
23b50 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
23b60 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
23b70 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
23b80 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
23b90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23ba0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
23bb0 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
23bc0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
23be0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
23bf0 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
23c00 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
23c10 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
23c20 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
23c30 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
23c40 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
23c50 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
23c60 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
23c70 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
23c80 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20  Handler */.){.  
23c90 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
23ca0 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
23cb0 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
23cc0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
23cd0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
23ce0 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
23cf0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
23d00 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28     void **ap = (
23d10 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d  void **)&pPager-
23d20 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  >xBusyHandler;. 
23d30 20 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74     assert( ((int
23d40 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b  (*)(void *))(ap[
23d50 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c  0]))==xBusyHandl
23d60 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  er );.    assert
23d70 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61  ( ap[1]==pBusyHa
23d80 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20  ndlerArg );.    
23d90 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
23da0 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
23db0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
23dc0 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28  L_BUSYHANDLER, (
23dd0 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a  void *)ap);.  }.
23de0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
23df0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
23e00 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
23e10 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
23e20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
23e30 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
23e40 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
23e50 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
23e60 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
23e70 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
23e80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
23e90 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
23ea0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
23eb0 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
23ec0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
23ed0 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
23ee0 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
23ef0 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
23f00 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20  xxx sub-code or 
23f10 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
23f20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
23f30 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
23f40 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
23f50 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
23f60 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
23f70 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
23f80 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
23f90 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
23fa0 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
23fb0 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
23fc0 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
23fd0 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
23fe0 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
23ff0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24000 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
24010 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
24020 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
24030 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
24040 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
24050 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
24060 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24070 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
24080 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
24090 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
240a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
240b0 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
240c0 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
240d0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
240e0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
240f0 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
24100 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
24110 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
24120 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
24130 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
24140 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
24150 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
24160 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
24170 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
24180 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
24190 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
241a0 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
241b0 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
241c0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
241d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
241e0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
241f0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
24200 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
24210 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
24220 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
24230 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
24240 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
24250 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
24260 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
24270 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
24280 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
24290 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
242a0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
242b0 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
242c0 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
242d0 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
242e0 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
242f0 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
24300 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
24310 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24320 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
24330 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20  er *pPager, u32 
24340 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
24350 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
24360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24370 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
24380 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20   possible to do 
24390 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61  a full assert_pa
243a0 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65  ger_state() here
243b0 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  , as this.  ** f
243c0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
243d0 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
243e0 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62  n PagerOpen(), b
243f0 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a  efore the state.
24400 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65    ** of the Page
24410 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65  r object is inte
24420 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e  rnally consisten
24430 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20  t..  **.  ** At 
24440 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66  one point this f
24450 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
24460 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
24470 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20   pager was in . 
24480 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
24490 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65  state. But since
244a0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
244b0 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  te guarantees th
244c0 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  at.  ** there is
244d0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
244e0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
244f0 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66  eference, this f
24500 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
24510 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74  a no-op for that
24520 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20   case anyhow..  
24530 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69  */..  u32 pageSi
24540 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
24550 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
24560 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
24570 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
24580 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
24590 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
245a0 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65   if( (pPager->me
245b0 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
245c0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
245d0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
245e0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
245f0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
24600 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20   && pageSize && 
24610 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70  pageSize!=(u32)p
24620 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
24630 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
24640 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  pNew = NULL;    
24650 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
24660 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20  temp space */.  
24670 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b    i64 nByte = 0;
24680 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
24690 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
246a0 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50  PEN && isOpen(pP
246b0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
246c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
246d0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
246e0 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  ->fd, &nByte);. 
246f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
24700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24710 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72      pNew = (char
24720 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
24730 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
24740 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
24750 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
24760 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
24770 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24790 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
247a0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
247b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
247c0 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
247d0 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
247e0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
247f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24800 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24810 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
24820 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
24830 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
24840 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
24850 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
24860 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79  ze = (Pgno)((nBy
24870 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70  te+pageSize-1)/p
24880 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
24890 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
248a0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
248b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
248c0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e  lite3PageFree(pN
248d0 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ew);.    }.  }..
248e0 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
248f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
24900 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
24920 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
24930 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
24940 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
24950 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
24960 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
24970 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
24980 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
24990 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
249a0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
249b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
249c0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
249d0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
249e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
249f0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24a00 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
24a10 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
24a20 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
24a30 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
24a40 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
24a50 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
24a60 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
24a70 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
24a80 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
24a90 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
24aa0 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
24ab0 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
24ac0 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
24ad0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
24ae0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
24af0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
24b00 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
24b10 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
24b20 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
24b30 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
24b40 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
24b50 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
24b60 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
24b70 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
24b80 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
24b90 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24ba0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
24bb0 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
24bc0 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
24bd0 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
24be0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
24bf0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
24c00 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
24c10 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
24c20 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
24c30 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
24c40 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
24c50 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
24c60 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
24c70 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
24c80 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
24c90 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
24ca0 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
24cb0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
24cc0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
24cd0 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
24ce0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
24cf0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
24d00 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
24d10 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
24d20 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
24d30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24d40 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
24d50 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
24d60 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
24d70 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
24d80 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
24d90 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
24da0 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
24db0 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
24dc0 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
24dd0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
24de0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
24df0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
24e00 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24e10 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
24e20 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
24e30 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
24e40 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
24e50 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
24e60 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
24e70 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
24e80 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
24e90 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
24ea0 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
24eb0 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
24ec0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
24ed0 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
24ee0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
24ef0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
24f00 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
24f10 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
24f20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24f30 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
24f40 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
24f50 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
24f60 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
24f70 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
24f80 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24f90 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
24fa0 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
24fb0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24fc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
24fd0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
24fe0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
24ff0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25000 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
25010 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25020 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
25030 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
25040 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
25050 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
25060 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
25070 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25080 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
25090 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
250a0 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
250b0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
250c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
250d0 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
250e0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
250f0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
25100 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
25110 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
25120 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
25130 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
25140 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
25150 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
25160 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
25170 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
25180 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
25190 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
251a0 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
251b0 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
251c0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
251d0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
251e0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
251f0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
25200 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
25210 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
25220 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
25230 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
25240 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
25250 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
25260 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
25270 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
25280 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
25290 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
252a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
252b0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
252c0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
252d0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
252e0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
252f0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
25300 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
25310 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
25320 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
25330 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
25340 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
25350 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
25360 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
25370 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
25380 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
25390 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
253a0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
253b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
253c0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
253d0 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
253e0 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
253f0 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
25400 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
25410 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
25420 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
25430 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
25440 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
25450 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
25460 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
25470 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
25480 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
25490 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
254a0 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
254b0 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
254c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
254d0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
254e0 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
254f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25500 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
25510 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
25530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
25550 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
25560 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
25570 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
25580 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
25590 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
255a0 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
255b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
255c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
255d0 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
255e0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
255f0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
25600 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
25610 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
25620 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
25630 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
25640 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
25650 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
25660 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
25670 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
25680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25690 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
256a0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
256b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
256c0 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
256d0 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
256e0 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
256f0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
25700 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
25710 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
25720 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
25730 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25740 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
25750 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
25760 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
25770 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
25780 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
25790 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
257a0 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
257b0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
257c0 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
257d0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
257e0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
257f0 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
25800 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
25810 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
25820 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
25830 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
25840 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
25850 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
25860 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
25870 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
25880 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
25890 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
258a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
258b0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
258c0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
258d0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
258e0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
258f0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
25900 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
25910 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
25920 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
25930 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
25940 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
25950 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
25960 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
25970 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
25980 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25990 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
259a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
259d0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
259e0 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
259f0 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
25a00 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
25a10 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
25a20 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20   already held), 
25a30 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72  or one of the tr
25a40 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74  ansitions that t
25a50 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
25a60 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
25a70 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
25a80 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
25a90 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
25aa0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
25ab0 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
25ac0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
25ad0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
25ae0 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
25af0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
25b00 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
25b10 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
25b20 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
25b30 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
25b40 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
25b50 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
25b60 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
25b70 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
25b80 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
25b90 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
25ba0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
25bb0 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
25bc0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
25bd0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
25be0 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
25bf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25c00 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
25c10 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25c20 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
25c30 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
25c40 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
25c50 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
25c60 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
25c70 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
25c80 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
25c90 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
25ca0 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
25cb0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
25cc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
25cd0 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
25ce0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
25cf0 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
25d00 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
25d10 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
25d20 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
25d30 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
25d40 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
25d50 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
25d60 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
25d70 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
25d80 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
25d90 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
25da0 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
25db0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
25dc0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
25dd0 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
25de0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
25df0 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
25e00 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
25e10 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
25e20 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
25e30 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
25e40 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
25e50 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
25e60 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
25e70 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
25e80 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
25e90 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
25ea0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
25eb0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
25ec0 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
25ed0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
25ee0 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
25ef0 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
25f00 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65  ehavior would be
25f10 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
25f20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
25f30 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
25f40 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
25f50 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
25f60 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
25f70 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
25f80 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
25f90 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
25fa0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
25fb0 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
25fc0 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
25fd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
25fe0 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
25ff0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
26000 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
26010 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
26020 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
26030 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
26040 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
26050 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
26060 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
26070 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
26080 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
26090 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
260a0 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
260b0 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
260c0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
260d0 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
260e0 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
260f0 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
26100 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
26110 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
26120 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
26130 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26140 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
26150 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
26160 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
26170 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
26180 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
26190 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
261a0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
261b0 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
261c0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
261d0 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
261e0 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
261f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
26200 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
26210 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
26220 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
26230 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
26240 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
26250 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
26260 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
26270 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
26280 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
26290 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
262a0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
262b0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
262c0 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
262d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
262e0 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
262f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26300 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
26310 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
26320 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
26330 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20  action..** Once 
26340 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
26350 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  s been called, t
26360 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
26370 75 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a  ust either be.**
26380 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20   rolled back or 
26390 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73  committed. It is
263a0 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c   not safe to cal
263b0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
263c0 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74  and.** then cont
263d0 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20  inue writing to 
263e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
263f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
26400 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
26410 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
26420 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
26430 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
26440 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
26450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26460 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
26470 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
26480 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
26490 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f  ze = nPage;..  /
264a0 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
264b0 68 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c  he code here cal
264c0 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  led assertTrunca
264d0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74  teConstraint() t
264e0 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68  o.  ** ensure th
264f0 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69  at all pages bei
26500 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61  ng truncated awa
26510 79 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  y by this operat
26520 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66  ion are,.  ** if
26530 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
26540 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e  epoints are open
26550 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  , present in the
26560 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
26570 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74   journal so that
26580 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73   they can be res
26590 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76  tored if the sav
265a0 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64  epoint is rolled
265b0 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73  .  ** back. This
265c0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
265d0 63 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20  cessary as this 
265e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
265f0 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64  only.  ** called
26600 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
26610 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
26620 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f  action. So altho
26630 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ugh the .  ** Pa
26640 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73  ger object may s
26650 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73  till have open s
26660 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72  avepoints (Pager
26670 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c  .nSavepoint!=0),
26680 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e   .  ** they cann
26690 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
266a0 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74  k. So the assert
266b0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
266c0 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69  nt() call.  ** i
266d0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72  s no longer corr
266e0 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a  ect. */.}.../*.*
266f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26700 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
26710 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f   attempting a ho
26720 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
26730 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20  ck. It.** syncs 
26740 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26750 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73   to disk, then s
26760 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ets pPager->jour
26770 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a  nalHdr to the.**
26780 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
26790 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61  rnal file so tha
267a0 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  t the pager_play
267b0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b  back() routine k
267c0 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  nows.** that the
267d0 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
267e0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
267f0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63  nced..**.** Sync
26800 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
26810 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  l to disk before
26820 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
26830 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75  oll it back ensu
26840 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20  res .** that if 
26850 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  a power-failure 
26860 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
26870 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  e rollback, the 
26880 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20  process that.** 
26890 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63  attempts rollbac
268a0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74  k following syst
268b0 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73  em recovery sees
268c0 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61   the same journa
268d0 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20  l.** content as 
268e0 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
268f0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
26900 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65  g goes as planne
26910 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
26920 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
26930 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  ise, .** an SQLi
26940 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
26950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
26960 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
26970 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26980 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26990 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
269a0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
269b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
269c0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
269d0 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
269e0 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69  NORMAL);.  }.  i
269f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26a00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
26a10 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
26a20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
26a30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
26a40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26a50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  c;.}../*.** Obta
26a60 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
26a70 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  o a memory mappe
26a80 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f  d page object fo
26a90 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  r page number pg
26aa0 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20  no. .** The new 
26ab0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20  object will use 
26ac0 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74  the pointer pDat
26ad0 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  a, obtained from
26ae0 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66   xFetch()..** If
26af0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
26b00 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e   *ppPage to poin
26b10 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
26b20 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61  e reference.** a
26b30 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
26b40 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
26b50 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
26b60 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
26b70 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74  set.** *ppPage t
26b80 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61  o zero..**.** Pa
26b90 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62  ge references ob
26ba0 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
26bb0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
26bc0 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73  should be releas
26bd0 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ed.** by calling
26be0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
26bf0 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
26c00 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
26c10 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67  reMapPage(.  Pag
26c20 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c40 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
26c50 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
26c80 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
26c90 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
26ca0 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28        /* xFetch(
26cb0 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69  )'d data for thi
26cc0 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
26cd0 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20  r **ppPage      
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26cf0 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67  UT: Acquired pag
26d00 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
26d10 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
26d40 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e  d page to return
26d50 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61   */.  .  if( pPa
26d60 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26d70 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
26d80 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
26d90 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
26da0 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
26db0 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
26dc0 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
26dd0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  rty = 0;.    mem
26de0 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30  set(p->pExtra, 0
26df0 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
26e00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26e10 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50  *ppPage = p = (P
26e20 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  gHdr *)sqlite3Ma
26e30 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
26e40 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d  PgHdr) + pPager-
26e50 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66  >nExtra);.    if
26e60 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p==0 ){.      
26e70 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
26e80 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
26e90 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
26ea0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26eb0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  Data);.      ret
26ec0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26ed0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
26ee0 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f   p->pExtra = (vo
26ef0 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  id *)&p[1];.    
26f00 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52  p->flags = PGHDR
26f10 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52  _MMAP;.    p->nR
26f20 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70  ef = 1;.    p->p
26f30 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
26f40 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
26f50 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20  ->pExtra==(void 
26f60 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73  *)&p[1] );.  ass
26f70 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30  ert( p->pPage==0
26f80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26f90 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d  >flags==PGHDR_MM
26fa0 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AP );.  assert( 
26fb0 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  p->pPager==pPage
26fc0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
26fd0 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20  ->nRef==1 );..  
26fe0 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  p->pgno = pgno;.
26ff0 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61    p->pData = pDa
27000 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ta;.  pPager->nM
27010 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74  mapOut++;..  ret
27020 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27030 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
27040 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
27050 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73  age pPg. pPg mus
27060 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75  t have been retu
27070 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65  rned by an .** e
27080 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70  arlier call to p
27090 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
270a0 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
270b0 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73  void pagerReleas
270c0 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a  eMapPage(PgHdr *
270d0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
270e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
270f0 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ger;.  pPager->n
27100 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67  MmapOut--;.  pPg
27110 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
27120 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27130 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  ;.  pPager->pMma
27140 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b  pFreelist = pPg;
27150 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
27160 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
27170 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b  ->iVersion>=3 );
27180 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65  .  sqlite3OsUnfe
27190 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
271a0 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
271b0 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
271c0 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  ize, pPg->pData)
271d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
271e0 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74  all PgHdr object
271f0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
27200 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c  Pager.pMmapFreel
27210 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ist list..*/.sta
27220 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
27230 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20  eeMapHdrs(Pager 
27240 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
27250 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70  r *p;.  PgHdr *p
27260 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50  Next;.  for(p=pP
27270 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27280 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  ist; p; p=pNext)
27290 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
272a0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c  >pDirty;.    sql
272b0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
272c0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  }.}.../*.** Shut
272d0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
272e0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
272f0 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
27300 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
27310 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
27320 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
27330 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
27340 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
27350 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
27360 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
27370 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
27380 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
27390 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
273a0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
273b0 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
273c0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
273d0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
273e0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
273f0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
27400 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
27410 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
27420 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
27430 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
27440 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
27450 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
27460 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
27470 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
27480 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
27490 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
274a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
274b0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
274c0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
274d0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
274e0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
274f0 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
27500 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
27510 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
27520 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
27530 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
27540 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70  pPager){.  u8 *p
27550 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
27560 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
27570 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
27580 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
27590 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c  ger) );.  disabl
275a0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
275b0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
275c0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
275d0 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72  loc();.  pagerFr
275e0 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72  eeMapHdrs(pPager
275f0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
27600 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
27610 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
27620 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
27630 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27640 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61  _WAL.  sqlite3Wa
27650 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
27660 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70  Wal, pPager->ckp
27670 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67  tSyncFlags, pPag
27680 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54  er->pageSize, pT
27690 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  mp);.  pPager->p
276a0 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Wal = 0;.#endif.
276b0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
276c0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
276d0 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
276e0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
276f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
27700 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
27710 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
27720 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
27730 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
27740 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
27750 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
27760 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
27770 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
27780 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
27790 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
277a0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
277b0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
277c0 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
277d0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
277e0 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
277f0 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
27800 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
27810 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
27820 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
27830 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
27840 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
27850 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
27860 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
27870 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
27880 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
27890 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
278a0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
278b0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
278c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
278d0 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
278e0 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
278f0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
27900 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
27910 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
27920 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
27930 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
27940 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
27950 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
27960 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
27970 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
27980 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
27990 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
279a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
279b0 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
279c0 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
279d0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
279e0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
279f0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
27a00 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
27a10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
27a20 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
27a30 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
27a40 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
27a50 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
27a60 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
27a70 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
27a80 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
27a90 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
27aa0 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
27ab0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
27ac0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
27ad0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
27ae0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
27af0 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
27b00 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
27b10 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
27b20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
27b30 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
27b40 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
27b50 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
27b60 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
27b70 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
27b80 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27b90 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
27ba0 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
27bb0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
27bc0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27bd0 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
27be0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
27bf0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
27c00 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
27c10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27c20 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
27c30 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
27c40 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
27c50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
27c60 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
27c70 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
27c80 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
27c90 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
27ca0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
27cb0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
27cc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
27cd0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
27ce0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
27cf0 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
27d00 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
27d10 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
27d20 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
27d30 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
27d40 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
27d50 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
27d60 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
27d70 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
27d80 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
27d90 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
27da0 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
27db0 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
27dc0 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
27dd0 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
27de0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
27df0 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
27e00 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
27e10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
27e20 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
27e30 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
27e40 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
27e50 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
27e60 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
27e70 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
27e80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
27e90 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
27ea0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
27eb0 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c  stics of the fil
27ec0 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c  e-system, as fol
27ed0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
27ee0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
27ef0 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ile is an in-mem
27f00 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
27f10 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64  , no action need
27f20 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e  .**     be taken
27f30 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65  ..**.**   * Othe
27f40 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65  rwise, if the de
27f50 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
27f60 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41  pport the SAFE_A
27f70 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a  PPEND property,.
27f80 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20  **     then the 
27f90 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
27fa0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
27fb0 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
27fc0 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73  header.**     is
27fd0 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74   updated to cont
27fe0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
27ff0 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  f journal record
28000 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
28010 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20     been written 
28020 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66  following it. If
28030 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70   the pager is op
28040 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d  erating in full-
28050 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65  sync.**     mode
28060 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
28070 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
28080 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  d before this fi
28090 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a  eld is updated..
280a0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
280b0 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
280c0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51   support the SEQ
280d0 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79  UENTIAL property
280e0 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a  , then .**     j
280f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
28100 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ynced..**.** Or,
28110 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a   in pseudo-code:
28120 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54  .**.**   if( NOT
28130 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72   <in-memory jour
28140 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69  nal> ){.**     i
28150 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45  f( NOT SAFE_APPE
28160 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ND ){.**       i
28170 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f  f( <full-sync mo
28180 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  de> ) xSync(<jou
28190 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
281a0 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52        <update nR
281b0 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20  ec field>.**    
281c0 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   } .**     if( N
281d0 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20  OT SEQUENTIAL ) 
281e0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
281f0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  ile>);.**   }.**
28200 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
28210 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
28220 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
28230 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
28240 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
28250 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
28260 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
28270 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
28280 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
28290 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
282a0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
282b0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
282c0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
282d0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
282e0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
282f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
28300 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b  er, int newHdr){
28310 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
28340 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
28350 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
28360 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
28370 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
28380 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
28390 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
283a0 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
283b0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
283c0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
283d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
283e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
283f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
28400 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
28410 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
28420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28430 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
28440 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
28450 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
28460 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
28470 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
28480 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28490 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
284a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
284b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
284c0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63  EMORY ){.      c
284d0 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
284e0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
284f0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
28500 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
28510 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
28520 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
28530 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
28540 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28550 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
28560 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
28570 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
28580 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62   an obscure prob
28590 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74  lem. If the last
285a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
285b0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74      ** that wrot
285c0 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  e to this databa
285d0 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67  se was operating
285e0 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a   in persistent-j
285f0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
28600 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  * mode, then the
28610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
28620 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
28630 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67  actually be larg
28640 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
28650 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  an Pager.journal
28660 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68  Off bytes. If th
28670 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20  e next thing in 
28680 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
28690 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70      ** file happ
286a0 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72  ens to be a jour
286b0 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74  nal-header (writ
286c0 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74  ten as part of t
286d0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
286e0 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f  evious connectio
286f0 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  n's transaction)
28700 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72  , and a crash or
28710 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a   power-failure .
28720 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72          ** occur
28730 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20  s after nRec is 
28740 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f  updated but befo
28750 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  re this connecti
28760 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20  on writes .     
28770 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65     ** anything e
28780 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  lse to the journ
28790 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d  al file (or comm
287a0 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69  its/rolls back i
287b0 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts .        ** t
287c0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65  ransaction), the
287d0 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63  n SQLite may bec
287e0 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65  ome confused whe
287f0 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20  n doing the .   
28800 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
28810 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  nal rollback fol
28820 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e  lowing recovery.
28830 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63   It may roll bac
28840 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  k all.        **
28850 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
28860 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20  ions data, then 
28870 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69  proceed to rolli
28880 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c  ng back the old,
28890 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d  .        ** out-
288a0 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61  of-date data tha
288b0 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61  t follows it. Da
288c0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
288d0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
288e0 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b        ** To work
288f0 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
28900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28910 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f  e does appear to
28920 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20   contain.       
28930 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64   ** a valid head
28940 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67  er following Pag
28950 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74  er.journalOff, t
28960 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30  hen write a 0x00
28970 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
28980 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
28990 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69   it to prevent i
289a0 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63  t from being rec
289b0 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20  ognized..       
289c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56   **.        ** V
289d0 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72  ariable iNextHdr
289e0 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
289f0 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77   the offset at w
28a00 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20  hich this.      
28a10 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63    ** problematic
28a20 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63   header will occ
28a30 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ur, if it exists
28a40 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64  . aMagic is used
28a50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20   .        ** as 
28a60 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
28a70 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68  er to inspect th
28a80 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
28a90 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20  f bytes of.     
28aa0 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74     ** the potent
28ab0 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ial journal head
28ac0 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
28ad0 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74         i64 iNext
28ae0 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
28af0 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
28b00 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61  .        u8 zHea
28b10 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28b20 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20  nalMagic)+4];.. 
28b30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48         memcpy(zH
28b40 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
28b50 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
28b60 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
28b70 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
28b80 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
28b90 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
28ba0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
28bb0 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64  .        iNextHd
28bc0 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61  rOffset = journa
28bd0 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
28be0 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
28bf0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
28c00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
28c10 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
28c20 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
28c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28c40 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
28c50 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
28c60 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
28c70 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
28c80 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
28c90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
28ca0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28cb0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
28cc0 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
28cd0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28cf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28d00 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
28d10 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
28d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
28d30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28d40 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
28d50 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
28d60 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
28d70 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
28d80 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
28d90 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
28da0 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
28db0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
28dc0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
28dd0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
28de0 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
28df0 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
28e00 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
28e10 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
28e20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
28e30 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
28e40 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
28e50 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28e60 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
28e70 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
28e80 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
28e90 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
28ea0 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
28eb0 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
28ec0 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
28ed0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
28ee0 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
28ef0 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
28f00 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
28f10 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
28f20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
28f30 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
28f40 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
28f50 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
28f60 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
28f70 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
28f80 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
28f90 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
28fa0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28fb0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
28fc0 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
28fd0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28fe0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
28ff0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
29000 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
29010 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
29020 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
29030 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
29040 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
29050 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
29060 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29070 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
29080 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
29090 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
290a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
290b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
290c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
290d0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
290e0 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
290f0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
29100 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
29110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29120 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
29130 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
29140 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
29150 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
29160 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
29170 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29190 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
291a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
291b0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
291c0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
291d0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
291e0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
291f0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
29200 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29210 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
29220 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
29230 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
29240 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29250 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
29260 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
29270 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  ncFlags| .      
29280 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
29290 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  cFlags==SQLITE_S
292a0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
292b0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
292c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
292d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
292e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
292f0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
29300 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
29310 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
29320 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20  ournalOff;.     
29330 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30   if( newHdr && 0
29340 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29350 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
29360 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
29370 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
29380 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
29390 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
293a0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
293b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
293c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
293d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
293e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
293f0 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
29400 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
29410 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c   }.  }..  /* Unl
29420 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
29430 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c   in noSync mode,
29440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29450 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a  e was just .  **
29460 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
29470 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  nced. Either way
29480 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  , clear the PGHD
29490 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
294a0 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61   on .  ** all pa
294b0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ges..  */.  sqli
294c0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
294d0 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
294e0 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67  pPCache);.  pPag
294f0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
29500 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b  ER_WRITER_DBMOD;
29510 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
29520 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
29530 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
29540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29550 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
29560 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
29570 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
29580 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
29590 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20  connected.** by 
295a0 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
295b0 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66   pointer. This f
295c0 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65  unction writes e
295d0 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  ach one of the.*
295e0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  * in-memory page
295f0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f  s in the list to
29600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29610 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
29620 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c   may.** be NULL,
29630 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
29640 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20   empty list. In 
29650 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
29660 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  unction is.** a 
29670 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
29680 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64   pager must hold
29690 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
296a0 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74  RVED lock when t
296b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
296c0 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72  is called. Befor
296d0 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69  e writing anythi
296e0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
296f0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f  se file, this lo
29700 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65  ck.** is upgrade
29710 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
29720 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  E lock. If the l
29730 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
29740 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  tained,.** SQLIT
29750 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
29760 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69  ed and no data i
29770 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
29780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29790 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
297a0 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ger is a temp-fi
297b0 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  le pager and the
297c0 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73   actual file-sys
297d0 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e  tem file.** is n
297e0 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20  ot yet open, it 
297f0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f  is created and o
29800 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79  pened before any
29810 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69   data is .** wri
29820 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  tten out..**.** 
29830 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  Once the lock ha
29840 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20  s been upgraded 
29850 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
29860 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  y, the file open
29870 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ed,.** the pages
29880 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74   are written out
29890 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
298a0 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72   file in list or
298b0 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20  der. Writing.** 
298c0 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65  a page is skippe
298d0 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69  d if it meets ei
298e0 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ther of the foll
298f0 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a  owing criteria:.
29900 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
29910 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  ge number is gre
29920 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e  ater than Pager.
29930 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20  dbSize, or.**   
29940 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  * The PGHDR_DONT
29950 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73  _WRITE flag is s
29960 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  et on the page..
29970 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67  **.** If writing
29980 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73   out a page caus
29990 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
299a0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61  file to grow, Pa
299b0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ger.dbFileSize.*
299c0 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  * is updated acc
299d0 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67  ordingly. If pag
299e0 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f  e 1 is written o
299f0 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ut, then the val
29a00 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20  ue cached.** in 
29a10 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
29a20 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  [] is updated to
29a30 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76   match the new v
29a40 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
29a50 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
29a60 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
29a70 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
29a80 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
29a90 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
29aa0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
29ab0 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  * occurs, an IO 
29ac0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29ad0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
29ae0 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
29af0 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f  k cannot.** be o
29b00 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f  btained, SQLITE_
29b10 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
29b20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29b30 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
29b40 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67  list(Pager *pPag
29b50 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74  er, PgHdr *pList
29b60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
29b70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
29b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29b90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
29ba0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
29bb0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
29bc0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  or rollback page
29bd0 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  rs in WRITER_DBM
29be0 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  OD state. */.  a
29bf0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
29c00 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
29c10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29c20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
29c30 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20  RITER_DBMOD );. 
29c40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29c50 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
29c60 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
29c70 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
29c80 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
29c90 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
29ca0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
29cb0 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
29cc0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
29cd0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
29ce0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
29cf0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
29d00 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
29d10 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
29d20 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
29d30 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
29d40 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
29d50 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
29d60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29d70 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
29d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
29d90 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
29da0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
29db0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
29dc0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
29dd0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
29de0 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
29df0 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
29e00 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
29e10 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
29e20 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
29e30 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
29e40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
29e50 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
29e60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
29e70 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50  ITE_OK .   && pP
29e80 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
29e90 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a  <pPager->dbSize.
29ea0 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44     && (pList->pD
29eb0 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  irty || pList->p
29ec0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69  gno>pPager->dbHi
29ed0 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  ntSize).  ){.   
29ee0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
29ef0 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
29f00 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
29f10 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
29f20 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
29f30 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
29f40 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
29f50 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
29f60 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
29f70 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
29f80 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
29f90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
29fa0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
29fb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
29fc0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
29fd0 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
29fe0 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
29ff0 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
2a000 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
2a010 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
2a020 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
2a030 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
2a040 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
2a050 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
2a060 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
2a070 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
2a080 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
2a090 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
2a0a0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
2a0b0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
2a0c0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
2a0d0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
2a0e0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
2a0f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
2a100 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
2a110 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
2a120 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
2a130 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
2a140 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
2a150 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
2a160 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
2a170 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
2a180 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
2a190 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
2a1a0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
2a1b0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
2a1c0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
2a1d0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
2a1e0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
2a1f0 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
2a200 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
2a210 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a230 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2a240 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
2a250 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2a260 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2a270 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2a280 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2a290 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
2a2a0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
2a2b0 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
2a2c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
2a2d0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
2a2e0 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
2a2f0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
2a300 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
2a310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a320 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b  EM_BKPT, pData);
2a330 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
2a340 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
2a350 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
2a360 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2a370 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
2a380 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
2a390 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
2a3a0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
2a3b0 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
2a3c0 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
2a3d0 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
2a3e0 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
2a3f0 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
2a400 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
2a410 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
2a420 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
2a430 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
2a440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a450 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
2a460 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
2a470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2a480 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
2a490 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2a4a0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
2a4b0 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
2a4c0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2a4d0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
2a4e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
2a4f0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
2a500 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
2a510 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2a520 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
2a530 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2a540 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
2a550 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
2a560 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
2a570 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
2a580 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
2a590 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
2a5a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
2a5b0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
2a5c0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
2a5d0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
2a5e0 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
2a5f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a600 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
2a610 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2a640 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
2a650 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
2a660 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
2a670 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
2a680 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
2a690 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
2a6a0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
2a6b0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
2a6c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a6d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
2a6e0 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
2a6f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2a700 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
2a710 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
2a720 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
2a730 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
2a740 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2a750 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2a760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
2a770 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
2a780 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2a790 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
2a7a0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
2a7b0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
2a7c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
2a7d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a7e0 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
2a7f0 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
2a800 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
2a810 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
2a820 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
2a830 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
2a840 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2a850 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
2a860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a870 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
2a880 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a890 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a8a0 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2a8b0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a8c0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
2a8d0 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54  t flags =  SQLIT
2a8e0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2a8f0 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
2a900 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20  READWRITE .     
2a910 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
2a920 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
2a930 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20  PEN_EXCLUSIVE . 
2a940 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
2a950 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2a960 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53  ;.    int nStmtS
2a970 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
2a980 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
2a990 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2a9a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2a9b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2a9c0 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
2a9d0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
2a9e0 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69  {.      nStmtSpi
2a9f0 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ll = -1;.    }. 
2aa00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2aa10 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
2aa20 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67  r->pVfs, 0, pPag
2aa30 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c  er->sjfd, flags,
2aa40 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20   nStmtSpill);.  
2aa50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2aa60 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
2aa70 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
2aa80 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
2aa90 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
2aaa0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
2aab0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2aac0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2aad0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2aae0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2aaf0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2ab00 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2ab10 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2ab20 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2ab30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2ab40 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2ab50 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2ab60 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2ab70 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2ab80 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2ab90 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2aba0 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2abb0 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2abc0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2abd0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2abe0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2abf0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2ac00 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2ac10 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2ac20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2ac30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ac40 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2ac50 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2ac60 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2ac70 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2ac80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2ac90 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2aca0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2acb0 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2acc0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2acd0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2ace0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2acf0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2ad00 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2ad10 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2ad20 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2ad30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2ad40 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ad50 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2ad60 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2ad70 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2ad80 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2ad90 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2ada0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2adb0 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2adc0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2add0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2ade0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2adf0 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2ae00 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2ae10 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2ae20 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2ae30 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2ae40 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2ae50 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2ae60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2ae70 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2ae80 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2ae90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2aea0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2aeb0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2aec0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2aed0 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2aee0 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2aef0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2af00 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2af10 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
2af20 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2af30 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2af40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2af50 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29  EM_BKPT, pData2)
2af60 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
2af70 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
2af80 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
2af90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2afa0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2afb0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2afc0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
2afd0 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
2afe0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2aff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b000 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2b010 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2b020 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
2b030 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
2b040 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
2b050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b060 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2b070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2b080 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
2b090 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2b0a0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2b0b0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
2b0c0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2b0d0 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
2b0e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
2b0f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2b100 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2b110 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2b120 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2b130 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2b140 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2b150 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61  return subjourna
2b160 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  lPage(pPg);.  }e
2b170 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2b180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
2b190 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2b1a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2b1b0 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
2b1c0 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
2b1d0 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
2b1e0 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
2b1f0 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
2b200 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
2b210 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
2b220 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
2b230 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
2b240 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
2b250 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
2b260 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
2b270 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
2b280 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
2b290 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2b2a0 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
2b2b0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
2b2c0 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
2b2d0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2b2e0 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
2b2f0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
2b300 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2b310 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
2b320 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2b330 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
2b340 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
2b350 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b360 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
2b370 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
2b380 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
2b390 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2b3a0 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
2b3b0 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
2b3c0 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
2b3d0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
2b3e0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
2b3f0 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
2b400 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2b410 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
2b420 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
2b430 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2b440 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2b450 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2b460 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
2b470 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
2b480 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
2b490 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2b4a0 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
2b4b0 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
2b4c0 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
2b4d0 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
2b4e0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2b4f0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
2b500 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
2b510 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
2b520 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
2b530 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
2b540 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
2b550 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
2b560 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2b570 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
2b580 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
2b590 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2b5a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2b5b0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2b5c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
2b5d0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2b5e0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
2b5f0 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
2b600 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e  bit is set durin
2b610 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2b620 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2b630 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2b640 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2b650 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2b660 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2b670 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2b680 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2b690 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2b6a0 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2b6b0 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2b6c0 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2b6d0 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2b6e0 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2b6f0 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c  e doNotSpill ROL
2b700 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69  LBACK and OFF bi
2b710 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ts inhibits all 
2b720 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20  cache spilling. 
2b730 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f   ** regardless o
2b740 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
2b750 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2b760 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2b770 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20  t during.  ** a 
2b780 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75  rollback or by u
2b790 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73  ser request, res
2b7a0 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a  pectively..  **.
2b7b0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
2b7c0 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
2b7d0 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
2b7e0 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
2b7f0 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
2b800 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
2b810 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
2b820 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
2b830 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20  ementation it . 
2b840 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
2b850 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61  e for sqlite3Pca
2b860 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
2b870 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
2b880 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20  ateFlag==3.  ** 
2b890 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
2b8a0 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
2b8b0 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
2b8c0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2b8d0 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
2b8e0 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
2b8f0 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
2b900 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
2b910 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
2b920 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
2b930 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
2b940 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
2b950 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
2b960 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2b970 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2b980 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
2b990 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73  TE_OK;.  testcas
2b9a0 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2b9b0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2b9c0 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  G_ROLLBACK );.  
2b9d0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2b9e0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2b9f0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a  PILLFLAG_OFF );.
2ba00 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2ba10 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2ba20 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
2ba30 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  C );.  if( pPage
2ba40 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20  r->doNotSpill.  
2ba50 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f   && ((pPager->do
2ba60 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c  NotSpill & (SPIL
2ba70 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53  LFLAG_ROLLBACK|S
2ba80 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d  PILLFLAG_OFF))!=
2ba90 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  0.      || (pPg-
2baa0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
2bab0 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20  EED_SYNC)!=0).  
2bac0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2bad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2bae0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
2baf0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
2bb00 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
2bb10 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
2bb20 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
2bb30 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
2bb40 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
2bb50 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2bb60 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a  Required(pPg); .
2bb70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bb80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2bb90 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
2bba0 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
2bbb0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2bbc0 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
2bbd0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
2bbe0 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
2bbf0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
2bc00 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2bc10 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
2bc20 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2bc30 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
2bc40 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
2bc50 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
2bc60 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
2bc70 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2bc80 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
2bc90 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2bca0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2bcb0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2bcc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bcd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2bce0 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
2bcf0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2bd00 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
2bd10 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2bd20 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
2bd30 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2bd40 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
2bd50 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
2bd60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2bd70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
2bd80 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
2bd90 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2bda0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2bdb0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2bdc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2bdd0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
2bde0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
2bdf0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2be00 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rc); .}../*.** F
2be10 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72  lush all unrefer
2be20 65 6e 63 65 64 20 64 69 72 74 79 20 70 61 67 65  enced dirty page
2be30 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  s to disk..*/.in
2be40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c  t sqlite3PagerFl
2be50 75 73 68 28 50 61 67 65 72 20 2a 70 50 61 67 65  ush(Pager *pPage
2be60 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  r){.  int rc = p
2be70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2be80 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
2be90 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74      PgHdr *pList
2bea0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2beb0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2bec0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
2bed0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
2bee0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
2bef0 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  r) );.    while(
2bf00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2bf10 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  & pList ){.     
2bf20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
2bf30 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2bf40 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
2bf50 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
2bf60 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 72     rc = pagerStr
2bf70 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65  ess((void*)pPage
2bf80 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r, pList);.     
2bf90 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d   }.      pList =
2bfa0 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20   pNext;.    }.  
2bfb0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2bfc0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2bfd0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2bfe0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
2bff0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
2c000 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
2c010 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
2c020 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
2c030 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
2c040 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
2c050 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
2c060 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
2c070 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
2c080 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
2c090 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
2c0a0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
2c0b0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
2c0c0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
2c0d0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
2c0e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2c0f0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
2c100 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
2c110 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
2c120 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
2c130 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
2c140 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
2c150 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
2c160 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
2c170 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
2c180 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
2c190 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
2c1a0 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
2c1b0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
2c1c0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
2c1d0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2c1e0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
2c1f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2c200 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
2c210 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
2c220 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
2c230 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
2c240 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
2c250 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
2c260 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2c270 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
2c280 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2c290 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
2c2a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
2c2b0 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
2c2c0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
2c2d0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
2c2e0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
2c2f0 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
2c300 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
2c310 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
2c320 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
2c330 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
2c340 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
2c350 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  the PAGER_* flag
2c360 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
2c370 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
2c380 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
2c390 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
2c3a0 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
2c3b0 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
2c3c0 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
2c3d0 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
2c3e0 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
2c3f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
2c400 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
2c410 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
2c420 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
2c430 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
2c440 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
2c450 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
2c460 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
2c470 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
2c480 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
2c490 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2c4a0 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
2c4b0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
2c4c0 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
2c4d0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
2c4e0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2c4f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
2c500 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
2c510 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
2c520 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
2c530 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2c540 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
2c550 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
2c560 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
2c570 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
2c580 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2c590 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
2c5a0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
2c5b0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
2c5c0 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
2c5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2c5e0 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
2c5f0 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
2c600 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2c610 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
2c620 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2c630 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2c640 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
2c650 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
2c660 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
2c670 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
2c680 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2c690 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6b0 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
2c6c0 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
2c6d0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
2c6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2c6f0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
2c700 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
2c710 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
2c720 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
2c730 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
2c740 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
2c750 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
2c760 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
2c770 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
2c780 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
2c790 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
2c7a0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
2c7b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c7c0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
2c7d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2c7e0 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
2c7f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c800 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
2c810 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
2c820 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
2c830 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
2c840 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2c850 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2c860 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
2c870 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
2c880 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c890 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
2c8a0 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
2c8b0 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
2c8c0 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
2c8d0 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2c8e0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2c8f0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
2c900 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2c910 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
2c920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2c930 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
2c940 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
2c950 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c960 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
2c970 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
2c980 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
2c990 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
2c9a0 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
2c9b0 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
2c9c0 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
2c9d0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2c9e0 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
2c9f0 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2ca00 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
2ca10 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c  .  u32 szPageDfl
2ca20 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2ca30 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
2ca40 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
2ca50 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ize */.  const c
2ca60 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20  har *zUri = 0;  
2ca70 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f    /* URI args to
2ca80 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   copy */.  int n
2ca90 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Uri = 0;        
2caa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2cab0 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72   bytes of URI ar
2cac0 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a  gs at *zUri */..
2cad0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
2cae0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
2caf0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  s required for e
2cb00 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ach journal file
2cb10 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68  -handle.  ** (th
2cb20 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74  ere are two of t
2cb30 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f  hem, the main jo
2cb40 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75  urnal and the su
2cb50 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a  b-journal).  */.
2cb60 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2cb70 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2cb80 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2cb90 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  fs));..  /* Set 
2cba0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2cbb0 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2cbc0 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2cbd0 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2cbe0 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2cbf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2cc00 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2cc10 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2cc20 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2cc30 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  1;.    if( zFile
2cc40 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2cc50 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50  e[0] ){.      zP
2cc60 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2cc70 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69  3DbStrDup(0, zFi
2cc80 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
2cc90 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2cca0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2ccb0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2ccc0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2ccd0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2cce0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2ccf0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2cd00 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2cd10 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2cd20 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2cd30 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2cd40 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2cd50 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2cd60 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2cd70 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2cd80 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2cd90 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2cda0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2cdb0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2cdc0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2cdd0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2cde0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2cdf0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2ce00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2ce10 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2ce20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2ce30 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2ce40 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
2ce50 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e  locRaw(0, nPathn
2ce60 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
2ce70 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
2ce80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ce90 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2cea0 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e      }.    zPathn
2ceb0 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d  ame[0] = 0; /* M
2cec0 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c  ake sure initial
2ced0 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c  ized even if Ful
2cee0 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c  lPathname() fail
2cef0 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  s */.    rc = sq
2cf00 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
2cf10 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2cf20 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
2cf30 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2cf40 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2cf50 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2cf60 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  hname);.    z = 
2cf70 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d  zUri = &zFilenam
2cf80 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
2cf90 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b  0(zFilename)+1];
2cfa0 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
2cfb0 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  {.      z += sql
2cfc0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2cfd0 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  1;.      z += sq
2cfe0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2cff0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55  +1;.    }.    nU
2d000 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d  ri = (int)(&z[1]
2d010 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73   - zUri);.    as
2d020 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b  sert( nUri>=0 );
2d030 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d040 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
2d050 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
2d060 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
2d070 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
2d080 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
2d090 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
2d0a0 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2d0b0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2d0c0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
2d0d0 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
2d0e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
2d0f0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
2d100 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
2d110 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
2d120 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
2d130 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
2d140 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
2d150 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
2d160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d170 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
2d180 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
2d190 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
2d1a0 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
2d1b0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2d1c0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2d1d0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
2d1e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d1f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2d200 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2d210 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
2d220 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
2d230 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2d240 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50  memory for the P
2d250 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
2d260 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74  PCache object, t
2d270 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69  he.  ** three fi
2d280 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
2d290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d2a0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a  e name and the j
2d2b0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
2d2c0 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f  e name. The layo
2d2d0 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20  ut in memory is 
2d2e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
2d2f0 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20  .  **     Pager 
2d300 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2d310 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
2d320 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a  f(Pager) bytes).
2d330 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20    **     PCache 
2d340 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2d350 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2d360 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79  3PcacheSize() by
2d370 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2d380 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
2d390 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70  le            (p
2d3a0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79  Vfs->szOsFile by
2d3b0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75  tes).  **     Su
2d3c0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  b-journal file h
2d3d0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a  andle         (j
2d3e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2d3f0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d  ytes).  **     M
2d400 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
2d410 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28   handle        (
2d420 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d430 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2d440 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  Database file na
2d450 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2d460 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74  (nPathname+1 byt
2d470 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75  es).  **     Jou
2d480 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20  rnal file name  
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2d4a0 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65  athname+8+1 byte
2d4b0 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d  s).  */.  pPtr =
2d4c0 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61   (u8 *)sqlite3Ma
2d4d0 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f  llocZero(.    RO
2d4e0 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2d4f0 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20  ger)) +      /* 
2d500 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2d510 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63  */.    ROUND8(pc
2d520 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20  acheSize) +     
2d530 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
2d540 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f  object */.    RO
2d550 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2d560 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  ile) +       /* 
2d570 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
2d580 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
2d590 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
2d5a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
2d5b0 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
2d5c0 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  */ .    nPathnam
2d5d0 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20  e + 1 + nUri +  
2d5e0 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
2d5f0 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68  ame */.    nPath
2d600 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20  name + 8 + 2    
2d610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f            /* zJo
2d620 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
2d630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2d640 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65  .    + nPathname
2d650 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20   + 4 + 2        
2d660 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
2d670 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
2d680 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2d690 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
2d6a0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
2d6b0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
2d6c0 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
2d6d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d6e0 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2d6f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d700 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2d710 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2d720 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2d730 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2d740 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2d750 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2d760 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2d770 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2d780 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2d790 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d7a0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2d7b0 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2d7c0 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2d7d0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d7e0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2d7f0 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2d800 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2d810 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d820 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2d830 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2d840 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2d850 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2d860 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2d870 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2d880 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d890 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2d8a0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2d8b0 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2d8c0 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2d8d0 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2d8e0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2d8f0 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2d900 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d910 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2d920 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2d930 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2d940 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2d950 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2d960 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d970 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2d980 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d990 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  e);.    if( nUri
2d9a0 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65   ) memcpy(&pPage
2d9b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
2d9c0 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c  thname+1], zUri,
2d9d0 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2d9e0 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
2d9f0 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
2da00 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2da10 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2da20 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2da30 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30  me], "-journal\0
2da40 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73  00", 8+2);.    s
2da50 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2da60 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2da70 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ame, pPager->zJo
2da80 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20  urnal);.#ifndef 
2da90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2daa0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c      pPager->zWal
2dab0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   = &pPager->zJou
2dac0 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38  rnal[nPathname+8
2dad0 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1];.    memcpy(
2dae0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
2daf0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2db00 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2db10 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2db20 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c  athname], "-wal\
2db30 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20  000", 4+1);.    
2db40 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2db50 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2db60 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57  name, pPager->zW
2db70 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  al);.#endif.    
2db80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2db90 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d   zPathname);.  }
2dba0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
2dbb0 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
2dbc0 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
2dbd0 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
2dbe0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
2dbf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2dc00 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2dc10 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
2dc20 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dc40 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
2dc50 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
2dc60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2dc70 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2dc80 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2dc90 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
2dca0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
2dcb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65  .    assert( !me
2dcc0 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f  mDb );.    readO
2dcd0 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2dce0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2dcf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2dd00 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2dd10 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2dd20 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2dd30 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2dd40 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2dd50 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2dd60 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2dd70 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2dd80 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2dd90 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2dda0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2ddb0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2ddc0 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2ddd0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dde0 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2ddf0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2de00 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2de10 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2de20 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2de30 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2de40 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2de50 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2de60 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2de70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2de80 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2de90 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2dea0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2deb0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2dec0 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2ded0 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2dee0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2def0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2df00 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2df10 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2df20 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2df30 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2df40 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2df50 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2df60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2df70 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2df80 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2df90 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dfa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dfb0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2dfc0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2dfd0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2dfe0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2dff0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2e000 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2e010 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2e020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e030 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2e040 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2e050 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2e060 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2e070 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2e080 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2e090 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2e0a0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2e0b0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2e0c0 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2e0d0 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2e0e0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2e0f0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2e100 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2e110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2e120 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2e130 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2e140 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e150 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2e160 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2e170 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2e180 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2e190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2e1a0 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e1c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e1d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2e1e0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2e1f0 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2e200 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2e210 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2e220 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2e230 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2e240 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2e250 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2e260 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2e270 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2e280 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2e290 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2e2a0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2e2b0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2e2c0 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2e2d0 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2e2e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2e2f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2e300 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2e310 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2e320 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2e330 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2e340 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2e350 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2e360 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2e370 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2e380 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2e390 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2e3a0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2e3b0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2e3c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2e3d0 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2e3e0 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2e3f0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2e400 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2e410 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2e420 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2e430 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2e440 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2e450 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2e460 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2e470 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2e480 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2e490 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2e4a0 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2e4b0 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2e4c0 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2e4d0 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2e4e0 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2e4f0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2e500 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2e510 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2e520 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2e530 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2e540 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2e550 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2e560 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2e570 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2e580 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20   EXCLUSIVE mode 
2e590 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2e5a0 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2e5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2e5c0 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2e5d0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2e5e0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2e5f0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2e600 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2e610 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2e620 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2e630 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2e640 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2e650 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2e660 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2e670 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2e680 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2e690 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2e6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2e6b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2e6c0 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2e6d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2e6e0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2e6f0 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2e700 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2e710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e720 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2e730 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2e740 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2e750 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e760 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2e770 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
2e780 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55      nExtra = ROU
2e790 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20  ND8(nExtra);.   
2e7a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2e7b0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2e7c0 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2e7d0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2e7e0 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2e7f0 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2e800 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2e810 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2e820 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e830 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2e840 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
2e850 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
2e860 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2e870 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2e880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e890 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
2e8a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2e8b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2e8c0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
2e8d0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
2e8e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2e8f0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2e900 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2e910 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2e920 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2e930 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2e940 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e950 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2e960 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2e970 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2e980 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2e990 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2e9a0 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2e9b0 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2e9c0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2e9d0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e9e0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2e9f0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2ea00 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2ea10 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2ea20 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2ea30 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2ea40 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ea50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2ea60 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2ea70 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2ea80 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2ea90 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2eaa0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2eab0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2eac0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2ead0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2eae0 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2eaf0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2eb00 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2eb10 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2eb20 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2eb30 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2eb40 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2eb50 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2eb60 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2eb70 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
2eb80 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
2eb90 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
2eba0 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
2ebb0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2ebc0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
2ebd0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2ebe0 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
2ebf0 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
2ec00 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
2ec10 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
2ec20 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
2ec30 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
2ec40 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
2ec50 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
2ec60 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2ec70 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2ec80 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2ec90 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
2eca0 73 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67  syncFlags = pPag
2ecb0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a  er->noSync ? 0 :
2ecc0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2ecd0 4d 41 4c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  MAL;.  pPager->c
2ece0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  kptSyncFlags = p
2ecf0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2ed00 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2ed10 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
2ed20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
2ed30 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
2ed40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ed50 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b  >extraSync==0 );
2ed60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ed70 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2ed80 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ed90 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2eda0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2edb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2edc0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30  ckptSyncFlags==0
2edd0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2ede0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2edf0 63 20 3d 20 31 3b 0a 23 69 66 20 53 51 4c 49 54  c = 1;.#if SQLIT
2ee00 45 5f 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a  E_EXTRA_DURABLE.
2ee10 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
2ee20 61 53 79 6e 63 20 3d 20 31 3b 0a 23 65 6c 73 65  aSync = 1;.#else
2ee30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74  .    pPager->ext
2ee40 72 61 53 79 6e 63 20 3d 20 30 3b 0a 23 65 6e 64  raSync = 0;.#end
2ee50 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  if.    pPager->s
2ee60 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2ee70 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2ee80 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
2ee90 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2eea0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57  _SYNC_NORMAL | W
2eeb0 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
2eec0 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72  IONS;.    pPager
2eed0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
2eee0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2eef0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  RMAL;.  }.  /* p
2ef00 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
2ef10 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2ef20 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
2ef30 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2ef40 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
2ef50 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
2ef60 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
2ef70 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
2ef80 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
2ef90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
2efa0 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
2efb0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
2efc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2efd0 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
2efe0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2eff0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
2f000 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2f010 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2f020 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2f030 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
2f040 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
2f050 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2f060 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2f070 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2f080 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
2f090 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
2f0a0 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
2f0b0 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
2f0c0 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
2f0d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
2f0e0 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
2f0f0 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2f100 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2f110 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2f120 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70  ash)); */.  /* p
2f130 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
2f140 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
2f150 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c  MAP_SIZE // will
2f160 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65   be set by btree
2f170 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  .c */..  *ppPage
2f180 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2f190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f1a0 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
2f1b0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2f1c0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20  file has not be 
2f1d0 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d  deleted or renam
2f1e0 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75  ed out from.** u
2f1f0 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20  nder the pager. 
2f200 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2f210 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  K if the databas
2f220 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20  e is still were 
2f230 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62  it ought.** to b
2f240 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75  e on disk.  Retu
2f250 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c  rn non-zero (SQL
2f260 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2f270 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68  OVED or some oth
2f280 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  er error.** code
2f290 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41   from sqlite3OsA
2f2a0 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20  ccess()) if the 
2f2b0 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e  database has gon
2f2c0 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e missing..*/.st
2f2d0 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
2f2e0 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72  eIsUnmoved(Pager
2f2f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2f300 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a   bHasMoved = 0;.
2f310 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2f320 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2f330 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
2f340 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2f350 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
2f360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f380 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
2f390 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2f3a0 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20  me[0] );.  rc = 
2f3b0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2f3c0 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
2f3d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
2f3e0 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f  S_MOVED, &bHasMo
2f3f0 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ved);.  if( rc==
2f400 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
2f410 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2f420 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d   HAS_MOVED file-
2f430 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70  control is unimp
2f440 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65  lemented, assume
2f450 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
2f460 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
2f470 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20  en moved.  That 
2f480 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61  is the historica
2f490 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51  l behavior of SQ
2f4a0 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20  Lite: prior to. 
2f4b0 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
2f4c0 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68  8.3, it never ch
2f4d0 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20  ecked */.    rc 
2f4e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2f4f0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2f500 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f  ITE_OK && bHasMo
2f510 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ved ){.    rc = 
2f520 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2f530 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72  DBMOVED;.  }.  r
2f540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2f550 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f560 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2f570 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2f580 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2f590 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2f5a0 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2f5b0 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2f5c0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2f5d0 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2f5e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2f5f0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2f600 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2f610 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2f620 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2f630 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2f640 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2f650 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2f660 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2f670 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2f680 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2f690 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2f6a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f6b0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2f6c0 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2f6d0 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2f6e0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2f6f0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2f700 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2f710 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2f720 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2f730 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2f740 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2f750 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2f760 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2f770 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2f780 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f790 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2f7a0 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2f7b0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2f7c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f7d0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2f7e0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2f7f0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2f800 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2f810 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2f820 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2f830 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2f840 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2f850 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2f860 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2f870 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2f880 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2f890 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2f8a0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2f8b0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2f8c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2f8d0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2f8e0 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2f8f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2f900 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2f910 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2f920 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
2f930 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
2f940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2f950 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2f960 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2f970 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2f980 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
2f990 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
2f9a0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2f9b0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2f9c0 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
2f9d0 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
2f9e0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
2f9f0 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
2fa00 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2fa10 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
2fa20 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
2fa30 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
2fa40 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
2fa50 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
2fa60 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
2fa70 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
2fa80 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
2fa90 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
2faa0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2fab0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
2fac0 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
2fad0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2fae0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2faf0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2fb00 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
2fb10 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2fb20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2fb30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2fb40 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
2fb50 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2fb60 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2fb70 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
2fb80 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
2fb90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2fba0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
2fbb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2fbc0 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
2fbd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2fbe0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2fbf0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
2fc00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2fc10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2fc20 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2fc30 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
2fc40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2fc50 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
2fc60 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
2fc70 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
2fc80 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
2fc90 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
2fca0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2fcb0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2fcc0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2fcd0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
2fce0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2fcf0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2fd00 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
2fd10 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
2fd20 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2fd30 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2fd40 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
2fd50 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
2fd60 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
2fd70 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
2fd80 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
2fd90 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2fda0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2fdb0 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
2fdc0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
2fdd0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2fde0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
2fdf0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2fe00 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
2fe10 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
2fe20 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
2fe30 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
2fe40 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
2fe50 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2fe60 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
2fe70 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
2fe80 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
2fe90 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
2fea0 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
2feb0 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
2fec0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
2fed0 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
2fee0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
2fef0 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
2ff00 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
2ff10 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
2ff20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
2ff30 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
2ff40 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
2ff50 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2ff60 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2ff70 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
2ff80 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
2ff90 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
2ffa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
2ffb0 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
2ffc0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2ffd0 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
2ffe0 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
2fff0 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
30000 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
30010 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
30020 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
30030 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
30040 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
30050 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
30060 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
30070 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
30080 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
30090 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
300a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
300b0 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
300c0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
300d0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
300e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
300f0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
30100 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
30110 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
30120 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
30130 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
30140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30150 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
30160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
30170 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
30180 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
30190 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
301a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
301b0 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
301c0 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
301d0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
301e0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
301f0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
30200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30210 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
30220 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
30230 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
30240 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
30250 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
30260 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
30270 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
30280 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
30290 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
302a0 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
302b0 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
302c0 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
302d0 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
302e0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
302f0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
30300 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
30310 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
30320 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
30330 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
30340 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
30350 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
30360 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
30370 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
30380 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
30390 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
303a0 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
303b0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
303c0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
303d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
303e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
303f0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
30400 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30410 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
30420 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
30430 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
30440 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
30450 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
30460 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
30480 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
30490 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
304a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
304b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
304c0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
304d0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
304e0 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
304f0 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
30500 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
30510 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
30520 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
30530 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
30540 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
30550 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
30560 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
30570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30580 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
30590 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
305a0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
305b0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
305c0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
305d0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
305e0 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
305f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30600 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
30610 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
30620 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53    int f = .#if S
30630 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
30640 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
30650 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
30660 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c  er->vfsFlags&SQL
30670 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f  ITE_OPEN_FILEPRO
30680 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23  TECTION_MASK)|.#
30690 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
306a0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
306b0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
306c0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
306d0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
306e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
306f0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
30700 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
30710 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
30720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30730 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30750 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
30760 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
30770 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
30780 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
30790 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
307a0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
307b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
307c0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
307d0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
307e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
307f0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
30800 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
30810 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30830 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
30840 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
30850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30860 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
30870 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
30880 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
30890 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
308a0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
308b0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
308c0 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
308d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
308e0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
308f0 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
30900 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
30910 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
30920 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
30930 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
30940 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
30950 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
30960 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
30970 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
30980 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
30990 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
309a0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
309b0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
309c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
309d0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
309e0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
309f0 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
30a00 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
30a10 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
30a20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
30a30 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
30a40 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
30a50 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
30a60 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
30a70 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
30a80 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
30a90 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
30aa0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
30ab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
30ac0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
30ad0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
30ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
30af0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
30b00 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
30b10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30b20 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
30b30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30b40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
30b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30b60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
30b70 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
30b80 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
30b90 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
30ba0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
30bb0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
30bc0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
30bd0 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65  Get() until afte
30be0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
30bf0 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
30c00 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
30c10 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
30c20 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
30c30 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
30c40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30c50 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
30c60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
30c70 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
30c80 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
30c90 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
30ca0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
30cb0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
30cc0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
30cd0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
30ce0 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
30cf0 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
30d00 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
30d10 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
30d20 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
30d30 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
30d40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30d50 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
30d60 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
30d70 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
30d80 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
30d90 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
30da0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
30db0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
30dc0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
30dd0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
30de0 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
30df0 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
30e00 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
30e10 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
30e20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
30e30 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
30e40 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
30e50 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
30e60 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
30e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
30e80 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
30e90 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
30ea0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
30eb0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
30ec0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
30ed0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
30ee0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
30ef0 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
30f00 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
30f10 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
30f20 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
30f30 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
30f40 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
30f50 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
30f60 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
30f70 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
30f80 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
30f90 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
30fa0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
30fb0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
30fc0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
30fd0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
30fe0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
30ff0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
31000 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
31010 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
31020 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
31030 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
31040 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
31050 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
31060 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
31070 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
31080 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
31090 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
310a0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
310b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
310c0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
310d0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
310e0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
310f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
31100 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
31110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
31120 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
31130 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
31140 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
31150 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
31160 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
31170 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
31180 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
31190 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
311a0 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
311b0 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
311c0 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
311d0 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
311e0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
311f0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
31200 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
31210 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
31220 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
31230 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
31240 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
31250 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
31260 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
31270 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
31280 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
31290 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
312a0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
312b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
312c0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
312d0 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44    if( NEVER(MEMD
312e0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  B && pPager->err
312f0 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20  Code) ){ return 
31300 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
31310 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72   }..  if( !pager
31320 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
31330 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
31340 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  ==PAGER_OPEN ){.
31350 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72      int bHotJour
31360 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20  nal = 1;        
31370 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
31380 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20  re exists a hot 
31390 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a  journal-file */.
313a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
313b0 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  MDB );..    rc =
313c0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
313d0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
313e0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
313f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31400 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
31410 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
31420 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  NO_LOCK || pPage
31430 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
31440 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
31450 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31460 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
31470 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
31480 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
31490 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
314a0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
314b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
314c0 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
314d0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
314e0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
314f0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
31500 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
31510 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
31520 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
31530 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
31540 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
31550 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
31560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31570 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31590 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
315a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
315b0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
315c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
315d0 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
315e0 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CK;.        goto
315f0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
31600 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  ..      /* Get a
31610 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
31620 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31630 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
31640 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
31650 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
31660 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
31670 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
31680 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
31690 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
316a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
316b0 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
316c0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
316d0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
316e0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
316f0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
31700 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
31710 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
31720 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
31730 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
31740 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
31750 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
31760 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
31770 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
31780 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
31790 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
317a0 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
317b0 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
317c0 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
317d0 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
317e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
317f0 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
31800 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
31810 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
31820 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
31830 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
31840 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
31850 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
31860 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
31870 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
31880 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
31890 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
318a0 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
318b0 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  s in locking_mod
318c0 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
318d0 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20  , the lock is.  
318e0 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65      ** downgrade
318f0 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b  d to SHARED_LOCK
31900 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
31910 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20  ction returns.. 
31920 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
31930 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
31940 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
31950 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
31960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31970 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
31980 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
31990 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74   .      /* If it
319a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
319b0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c  open and the fil
319c0 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  e exists on disk
319d0 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20  , open the .    
319e0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72    ** journal for
319f0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
31a00 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73  ss. Write access
31a10 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
31a20 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  ause .      ** i
31a30 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
31a40 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
31a50 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
31a60 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20   be kept open . 
31a70 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73       ** and poss
31a80 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
31a90 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
31aa0 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74  r on. Also, writ
31ab0 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20  e-access .      
31ac0 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65  ** is usually re
31ad0 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69  quired to finali
31ae0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ze the journal i
31af0 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  n journal_mode=p
31b00 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  ersist .      **
31b10 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20   mode (and also 
31b20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  for journal_mode
31b30 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d  =truncate on som
31b40 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20  e systems)..    
31b50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
31b60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
31b70 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
31b80 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
31b90 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a  at some .      *
31ba0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
31bb0 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
31bc0 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
31bd0 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
31be0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
31bf0 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
31c00 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
31c10 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
31c20 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d   .      ** may m
31c30 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
31c40 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
31c50 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
31c60 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
31c70 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
31c80 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
31c90 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
31ca0 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
31cb0 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
31cc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
31cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31ce0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
31cf0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
31d00 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45  ;.        int bE
31d10 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
31d20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
31d30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
31d40 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ts */.        rc
31d50 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
31d60 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss(.            
31d70 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
31d80 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
31d90 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62  CCESS_EXISTS, &b
31da0 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20  Exists);.       
31db0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31dc0 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
31dd0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
31de0 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
31df0 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20     int f = .#if 
31e00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
31e10 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
31e20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
31e30 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
31e40 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
31e50 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65  ECTION_MASK)|.#e
31e60 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
31e70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
31e80 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
31e90 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
31ea0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31eb0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
31ec0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
31ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31ee0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
31ef0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
31f00 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
31f10 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
31f20 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
31f30 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
31f40 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
31f50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
31f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
31f70 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
31f80 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
31f90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31fa0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
31fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
31fc0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
31fd0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
31fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31ff0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
32000 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
32010 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
32020 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
32030 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
32040 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
32050 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
32060 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
32070 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
32080 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
32090 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
320a0 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
320b0 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
320c0 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
320d0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
320e0 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
320f0 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
32100 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
32110 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
32120 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
32130 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
32140 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
32150 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
32160 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
32170 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
32180 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
32190 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
321a0 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
321b0 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
321c0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
321d0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
321e0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
321f0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
32200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
32210 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32220 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
32230 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
32240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32250 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
32260 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
32270 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
32280 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
32290 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
322a0 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
322b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
322c0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
322d0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
322e0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
322f0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
32300 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
32310 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32330 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
32340 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
32350 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
32360 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
32370 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
32380 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
32390 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
323a0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
323b0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
323c0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
323d0 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
323e0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
323f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
32400 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
32410 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
32420 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
32430 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
32440 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
32450 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
32460 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
32470 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
32480 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
32490 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
324a0 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
324b0 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
324c0 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
324d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
324e0 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
324f0 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
32500 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
32510 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
32520 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
32530 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
32540 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
32550 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
32560 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
32570 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
32580 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
32590 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
325a0 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
325b0 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
325c0 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
325d0 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
325e0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
325f0 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
32600 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
32610 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
32620 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
32630 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
32640 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
32650 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
32660 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
32670 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
32680 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
32690 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
326a0 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
326b0 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
326c0 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
326d0 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
326e0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
326f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
32700 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
32710 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
32720 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
32730 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32750 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32760 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
32770 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
32780 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
32790 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
327a0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
327b0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
327c0 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
327d0 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
327e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
327f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
32800 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  & pPager->hasHel
32810 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20  dSharedLock ){. 
32820 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
32830 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
32840 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 74   been acquired t
32850 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20  hen check to.   
32860 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65     ** see if the
32870 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
32880 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
32890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
328a0 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20  s changed,.     
328b0 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61   ** flush the ca
328c0 63 68 65 2e 20 20 54 68 65 20 68 61 73 48 65 6c  che.  The hasHel
328d0 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67  dSharedLock flag
328e0 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66   prevents this f
328f0 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  rom.      ** occ
32900 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65  urring on the ve
32910 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73 20  ry first access 
32920 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72  to a file, in or
32930 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20  der to save a.  
32940 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e      ** single un
32950 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74 65  necessary sqlite
32960 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61  3OsRead() call a
32970 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a  t the start-up..
32980 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32990 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
329a0 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  es are detected 
329b0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
329c0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
329d0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
329e0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
329f0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
32a00 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
32a10 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
32a20 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
32a30 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
32a40 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
32a50 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
32a60 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
32a70 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
32a80 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
32a90 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
32aa0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
32ab0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
32ac0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
32ad0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
32ae0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
32af0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
32b00 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
32b10 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
32b20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
32b30 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
32b40 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
32b50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
32b60 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
32b70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32b80 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
32b90 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
32ba0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
32bb0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
32bc0 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
32bd0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
32be0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
32bf0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
32c00 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
32c10 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
32c20 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
32c30 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
32c40 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
32c50 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32c60 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32c70 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
32c80 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
32c90 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
32ca0 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
32cb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32cc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
32cd0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
32ce0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
32cf0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32d00 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
32d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32d20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
32d30 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
32d40 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
32d50 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
32d60 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
32d70 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
32d80 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
32d90 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
32da0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
32db0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  eset(pPager);.. 
32dc0 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20         /* Unmap 
32dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32de0 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  e. It is possibl
32df0 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20  e that external 
32e00 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20  processes.      
32e10 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72    ** may have tr
32e20 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61  uncated the data
32e30 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
32e40 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62  en extended it b
32e50 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ack.        ** t
32e60 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
32e70 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70  ize while this p
32e80 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68  rocess was not h
32e90 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20  olding a lock.. 
32ea0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
32eb0 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79  s case there may
32ec0 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70   exist a Pager.p
32ed0 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74  Map mapping that
32ee0 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20   appears.       
32ef0 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69   ** to be the ri
32f00 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20  ght size but is 
32f10 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c  not actually val
32f20 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20  id. Avoid this. 
32f30 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
32f40 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69  ility by unmappi
32f50 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20  ng the db here. 
32f60 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55  */.        if( U
32f70 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
32f80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
32f90 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
32fa0 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
32fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32fc0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
32fd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
32fe0 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
32ff0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
33000 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
33010 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
33020 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
33030 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
33040 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
33050 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
33060 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
33070 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
33080 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
33090 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
330a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
330b0 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
330c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
330d0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
330e0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
330f0 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
33100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33110 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
33120 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
33130 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
33140 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
33150 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33160 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49  OPEN && rc==SQLI
33170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
33180 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
33190 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
331a0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
331b0 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
331c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
331d0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
331e0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
331f0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
33200 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33210 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33220 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73  R_OPEN );.  }els
33230 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
33240 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
33250 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72  ADER;.    pPager
33260 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
33270 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ock = 1;.  }.  r
33280 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33290 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
332a0 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
332b0 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
332c0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
332d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
332e0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
332f0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
33300 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
33310 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
33320 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
33330 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
33340 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
33350 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
33360 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
33370 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
33380 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
33390 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
333a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
333b0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
333c0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
333d0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
333e0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
333f0 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20  >nMmapOut==0 && 
33400 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
33410 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
33420 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20  PCache)==0) ){. 
33430 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
33440 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
33450 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
33460 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
33470 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
33480 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
33490 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
334a0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
334b0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
334c0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
334d0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
334e0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
334f0 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
33500 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
33510 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
33520 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
33530 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
33540 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
33550 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
33560 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
33570 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
33580 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
33590 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
335a0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
335b0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
335c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
335d0 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
335e0 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
335f0 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
33600 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
33610 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
33620 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
33630 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
33640 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
33650 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
33660 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
33670 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
33680 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
33690 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
336a0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
336b0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
336c0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
336d0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
336e0 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
336f0 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
33700 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
33710 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
33720 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
33730 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
33740 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
33750 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
33760 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
33770 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
33780 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
33790 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
337a0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
337b0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
337c0 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
337d0 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
337e0 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
337f0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
33800 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
33810 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
33820 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
33830 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
33840 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
33850 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
33860 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
33870 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
33880 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
33890 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
338a0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
338b0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
338c0 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
338d0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
338e0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
338f0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
33900 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
33910 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e  curs in two scen
33920 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
33930 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
33940 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
33950 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
33960 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
33970 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
33980 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
33990 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
339a0 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
339b0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
339c0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
339d0 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
339e0 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
339f0 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
33a00 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
33a10 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
33a20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
33a30 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
33a40 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
33a50 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
33a60 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
33a70 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
33a80 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
33a90 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
33aa0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
33ab0 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
33ac0 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
33ad0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
33ae0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
33af0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
33b00 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33b10 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
33b20 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
33b30 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
33b40 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
33b50 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
33b60 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
33b70 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
33b80 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
33b90 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
33ba0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
33bb0 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
33bc0 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
33bd0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
33be0 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
33bf0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
33c00 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
33c10 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
33c20 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
33c30 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
33c40 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
33c50 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
33c60 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
33c70 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
33c80 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
33c90 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
33ca0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
33cb0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
33cc0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
33cd0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
33ce0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
33cf0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
33d00 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
33d10 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
33d20 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
33d30 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
33d40 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
33d50 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
33d60 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
33d70 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
33d80 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
33d90 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
33da0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
33db0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
33dc0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
33dd0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
33de0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
33df0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
33e00 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
33e10 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
33e20 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
33e30 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
33e40 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
33e50 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
33e60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
33e70 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
33e80 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
33e90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
33ea0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
33eb0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
33ec0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
33ed0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
33ee0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
33ef0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
33f00 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
33f10 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
33f20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
33f30 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
33f40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33f50 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
33f60 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72  g = 0;.  u32 iFr
33f70 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
33f80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d           /* Fram
33f90 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57  e to read from W
33fa0 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e  AL file */.  con
33fb0 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  st int noContent
33fc0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
33fd0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
33fe0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63  ;..  /* It is ac
33ff0 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20  ceptable to use 
34000 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61  a read-only (mma
34010 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20  p) page for any 
34020 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a  page except.  **
34030 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65   page 1 if there
34040 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
34050 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72  nsaction open or
34060 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41   the ACQUIRE_REA
34070 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20  DONLY.  ** flag 
34080 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79  was specified by
34090 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64   the caller. And
340a0 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   so long as the 
340b0 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a  db is not a .  *
340c0 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  * temporary or i
340d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
340e0 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  e.  */.  const i
340f0 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67  nt bMmapOk = (pg
34100 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43 48  no>1 && USEFETCH
34110 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20 28  (pPager).   && (
34120 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
34130 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20  PAGER_READER || 
34140 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
34150 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69  ET_READONLY)).#i
34160 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
34170 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61 67  CODEC.   && pPag
34180 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65  er->xCodec==0.#e
34190 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  ndif.  );..  /* 
341a0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74  Optimization not
341b0 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22  e:  Adding the "
341c0 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65  pgno<=1" term be
341d0 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68  fore "pgno==0" h
341e0 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20  ere.  ** allows 
341f0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
34200 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20  imizer to reuse 
34210 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
34220 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a  he "pgno>1".  **
34230 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65   test in the pre
34240 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c  vious statement,
34250 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69   and avoid testi
34260 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68  ng pgno==0 in th
34270 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61  e.  ** common ca
34280 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73  se where pgno is
34290 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28   large. */.  if(
342a0 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f   pgno<=1 && pgno
342b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
342c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
342d0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
342e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
342f0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
34300 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
34310 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
34320 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
34330 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74  ssert( noContent
34340 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d  ==0 || bMmapOk==
34350 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0 );..  assert( 
34360 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
34370 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  haredLock==1 );.
34380 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
34390 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
343a0 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
343b0 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
343c0 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
343d0 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
343e0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
343f0 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
34400 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
34410 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
34420 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
34430 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
34440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
34450 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
34460 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
34470 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
34480 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
34490 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
344a0 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b   pgno, &iFrame);
344b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
344c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
344d0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
344e0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
344f0 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72  ( bMmapOk && iFr
34500 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
34510 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
34520 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
34530 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67  ite3OsFetch(pPag
34540 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
34550 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29     (i64)(pgno-1)
34560 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
34570 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ize, pPager->pag
34580 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20  eSize, &pData.  
34590 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
345a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
345b0 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  && pData ){.    
345c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
345d0 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41  eState>PAGER_REA
345e0 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DER ){.         
345f0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
34600 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
34610 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
34620 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
34630 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
34640 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
34650 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
34660 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c  er, pgno, pData,
34670 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
34680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34690 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
346a0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
346b0 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67  64)(pgno-1)*pPag
346c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
346d0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata);.        }.
346e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20          if( pPg 
346f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
34700 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34710 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OK );.          
34720 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
34730 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
34740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
34750 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34760 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34770 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34780 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34790 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
347a0 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20      }..    {.   
347b0 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68     sqlite3_pcach
347c0 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20  e_page *pBase;. 
347d0 20 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c       pBase = sql
347e0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
347f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
34800 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20   pgno, 3);.     
34810 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
34820 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34830 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34840 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Stress(pPager->p
34850 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70  PCache, pgno, &p
34860 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Base);.        i
34870 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34880 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
34890 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
348a0 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
348b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
348c0 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a   = *ppPage = 0;.
348d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
348e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
348f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
34900 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34910 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rr;.        }.  
34920 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20      }.      pPg 
34930 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
34940 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
34950 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
34960 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
34970 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
34980 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 20 20  ( pPg!=0 );.    
34990 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
349a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
349b0 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
349c0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
349d0 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
349e0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
349f0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
34a00 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
34a10 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
34a20 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
34a30 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
34a40 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
34a50 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
34a60 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
34a70 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
34a80 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
34a90 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34aa0 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
34ab0 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65  t( pPg==(*ppPage
34ac0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34ad0 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
34ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
34af0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
34b00 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
34b10 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d  0 );..  if( pPg-
34b20 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
34b30 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
34b40 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34b50 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
34b60 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
34b70 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
34b80 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
34b90 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
34ba0 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
34bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
34bc0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
34bd0 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
34be0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
34bf0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
34c00 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
34c10 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74  _HIT]++;.    ret
34c20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
34c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
34c40 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
34c50 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
34c60 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
34c70 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
34c80 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
34c90 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50  zed.  */..    pP
34ca0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
34cb0 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  er;..    /* The 
34cc0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
34cd0 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
34ce0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
34cf0 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20  PT if a page.   
34d00 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
34d10 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
34d20 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b   the unused lock
34d30 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71  ing-page, is req
34d40 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
34d50 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
34d60 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
34d70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34d80 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
34d90 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34da0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
34db0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34dc0 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
34dd0 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
34de0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
34df0 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
34e00 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
34e10 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
34e20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
34e30 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
34e40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
34e50 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
34e60 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34e70 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
34e80 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
34e90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
34ea0 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
34eb0 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
34ec0 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
34ed0 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
34ee0 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
34ef0 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
34f00 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
34f10 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
34f20 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
34f30 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
34f40 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
34f50 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
34f60 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
34f70 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
34f80 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
34f90 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
34fa0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
34fb0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
34fc0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
34fd0 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
34fe0 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
34ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
35000 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
35010 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
35020 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
35030 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
35040 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
35050 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
35060 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
35070 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
35080 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
35090 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
350a0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
350b0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
350c0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
350d0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
350e0 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
350f0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
35100 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
35110 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
35120 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
35130 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
35140 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
35150 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
35160 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
35170 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
35180 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
35190 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
351a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
351b0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
351c0 28 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61  (pPager) && bMma
351d0 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pOk==0 ){.      
351e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
351f0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
35200 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
35210 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  iFrame);.       
35220 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35230 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
35240 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
35250 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
35260 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
35270 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
35280 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
35290 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
352a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
352b0 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
352c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
352d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
352e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
352f0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35310 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
35320 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
35330 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35340 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
35350 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
35360 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
35370 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
35380 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
35390 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
353a0 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
353b0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
353c0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
353d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
353e0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
353f0 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
35400 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
35410 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
35420 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
35430 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
35440 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
35450 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
35460 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
35470 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
35480 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65  ache. .**.** See
35490 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
354a0 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
354b0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
354c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
354d0 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
354e0 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
354f0 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
35500 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
35510 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
35520 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
35530 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
35540 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
35550 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
35560 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
35570 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
35580 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
35590 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
355a0 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
355b0 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
355c0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
355d0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
355e0 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65   pgno){.  sqlite
355f0 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
35600 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
35610 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
35620 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
35630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35640 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
35650 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69  ;.  pPage = sqli
35660 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
35670 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35680 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  pgno, 0);.  asse
35690 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20  rt( pPage==0 || 
356a0 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
356b0 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69  haredLock );.  i
356c0 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65  f( pPage==0 ) re
356d0 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
356e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
356f0 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
35700 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
35710 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pPage);.}../*.*
35720 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
35730 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
35740 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
35750 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
35760 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
35770 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
35780 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
35790 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
357a0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
357b0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
357c0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
357d0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
357e0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
357f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
35800 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
35810 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
35820 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
35830 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67  Null(DbPage *pPg
35840 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
35850 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
35860 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  g!=0 );.  pPager
35870 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
35880 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
35890 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
358a0 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61 73  .    pagerReleas
358b0 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20  eMapPage(pPg);. 
358c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
358d0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
358e0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
358f0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
35900 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64  (pPager);.}.void
35910 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35920 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
35930 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71 6c  .  if( pPg ) sql
35940 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
35950 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f  tNull(pPg);.}../
35960 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
35970 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
35980 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
35990 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
359a0 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
359b0 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
359c0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
359d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
359e0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
359f0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
35a00 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
35a10 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
35a20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
35a30 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
35a40 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
35a50 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
35a60 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
35a70 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
35a80 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
35a90 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
35aa0 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
35ab0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
35ac0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
35ad0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35ae0 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
35af0 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
35b00 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
35b10 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
35b20 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
35b30 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
35b40 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
35b50 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
35b60 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
35b70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35b80 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
35b90 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
35ba0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
35bb0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
35bc0 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
35bd0 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
35be0 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
35bf0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
35c00 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
35c10 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
35c20 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
35c30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
35c40 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
35c50 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
35c60 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
35c70 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
35c80 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
35c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
35ca0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
35cb0 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
35cc0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
35cd0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
35ce0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
35cf0 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
35d00 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
35d10 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
35d20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
35d30 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
35d40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35d50 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
35d60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
35d70 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
35d80 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
35d90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
35da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35db0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35dc0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
35dd0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
35de0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
35df0 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
35e00 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
35e10 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
35e20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35e30 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
35e40 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
35e50 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35e60 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35e70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35e80 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
35e90 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
35ea0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
35eb0 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
35ec0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
35ed0 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
35ee0 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
35ef0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
35f00 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
35f10 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
35f20 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
35f30 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
35f40 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
35f50 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
35f60 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35f70 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
35f80 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
35f90 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
35fa0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
35fb0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
35fc0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
35fd0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
35fe0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
35ff0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
36000 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
36010 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
36020 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
36030 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
36040 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
36050 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
36060 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
36070 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
36080 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
36090 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
360a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
360b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
360c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
360d0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
360e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
360f0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
36100 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
36110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
36120 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
36130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36140 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
36150 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
36160 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49  file */.#if SQLI
36170 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
36180 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20  ROTECTION.      
36190 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73      (pPager->vfs
361a0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
361b0 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e  N_FILEPROTECTION
361c0 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20  _MASK)|.#endif. 
361d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
361e0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
361f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
36200 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  E|.          (pP
36210 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
36220 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53   .            (S
36230 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
36240 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
36250 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
36260 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  L):.            
36270 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
36280 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
36290 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
362a0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
362b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
362c0 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
362d0 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
362e0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
362f0 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
36300 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
36310 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
36320 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
36330 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
36340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36350 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
36360 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
36370 54 45 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  TE.          rc 
36380 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
36390 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
363a0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
363b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
363c0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
363d0 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
363e0 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 20  Pager).         
363f0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
36400 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36410 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
36420 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
36430 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
36440 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
36450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
36470 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
36480 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
36490 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
364a0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
364b0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
364c0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
364d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
364e0 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
364f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
36500 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
36510 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
36520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36530 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
36540 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
36550 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
36560 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
36570 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
36580 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
36590 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
365a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
365b0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
365c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
365d0 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
365e0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
365f0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
36600 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
36610 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36620 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
36630 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
36640 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
36650 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
36660 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
36670 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
36680 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36690 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
366a0 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
366b0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
366c0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
366d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
366e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
366f0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
36700 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
36710 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
36720 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
36730 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
36740 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
36750 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
36760 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
36770 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
36780 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
36790 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
367a0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
367b0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
367c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
367d0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
367e0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
367f0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
36800 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
36810 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
36820 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
36830 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
36840 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
36850 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
36860 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
36870 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
36880 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
36890 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
368a0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
368b0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
368c0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
368d0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
368e0 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
368f0 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
36900 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
36910 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
36920 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
36930 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
36940 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
36950 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
36960 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
36970 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
36980 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
36990 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
369a0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
369b0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
369c0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
369d0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
369e0 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
369f0 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
36a00 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
36a10 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
36a20 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
36a30 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
36a40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36a50 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
36a60 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
36a70 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
36a80 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
36a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
36aa0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
36ab0 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
36ac0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
36ad0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36ae0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
36af0 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
36b00 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
36b10 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
36b20 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
36b30 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
36b40 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
36b50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36b60 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
36b70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36b80 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
36b90 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
36ba0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36bb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
36bc0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
36bd0 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
36be0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
36bf0 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
36c00 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
36c10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36c20 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
36c30 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
36c40 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
36c50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
36c60 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
36c70 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
36c80 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36c90 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
36ca0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36cb0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36cc0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36cd0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
36ce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36cf0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
36d00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
36d10 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73  .        (void)s
36d20 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
36d30 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
36d40 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
36d50 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
36d60 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
36d70 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
36d80 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
36d90 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
36da0 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
36db0 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
36dc0 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
36dd0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
36de0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
36df0 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
36e00 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
36e10 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
36e20 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
36e30 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
36e40 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
36e50 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
36e60 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
36e70 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
36e80 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
36e90 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
36ea0 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
36eb0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
36ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
36ed0 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
36ee0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
36ef0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
36f00 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
36f10 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
36f20 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
36f30 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
36f40 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
36f50 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
36f60 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
36f70 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
36f80 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
36f90 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
36fa0 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
36fb0 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
36fc0 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
36fd0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
36fe0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
36ff0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
37000 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
37010 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
37020 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37030 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
37040 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
37050 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
37060 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
37070 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
37080 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
37090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
370a0 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
370b0 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
370c0 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
370d0 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
370e0 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
370f0 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
37100 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
37110 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
37120 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
37130 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
37140 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
37150 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
37160 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
37170 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
37180 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
37190 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
371a0 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
371b0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
371c0 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
371d0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
371e0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
371f0 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
37200 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
37210 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
37220 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
37230 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
37240 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
37250 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
37260 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
37270 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
37280 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
37290 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
372a0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
372b0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
372c0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
372d0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
372e0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
372f0 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
37300 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
37310 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
37320 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
37330 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
37340 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
37350 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37360 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
37370 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
37380 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
37390 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
373a0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
373b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
373c0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
373d0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
373e0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
373f0 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
37400 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
37410 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
37420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
37430 74 65 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f  te page pPg onto
37440 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
37450 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
37470 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
37480 70 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f  pagerAddPageToRo
37490 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67  llbackJournal(Pg
374a0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
374b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
374c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
374d0 72 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  rc;.  u32 cksum;
374e0 0a 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b  .  char *pData2;
374f0 0a 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50  .  i64 iOff = pP
37500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37510 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c  ;..  /* We shoul
37520 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
37530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37540 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
37550 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
37560 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
37570 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
37580 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
37590 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f  .  ** that we do
375a0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72   not. */.  asser
375b0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
375c0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
375d0 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
375e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
375f0 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
37600 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f  urnalOff );.  CO
37610 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
37620 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  ->pData, pPg->pg
37630 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
37640 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
37650 20 70 44 61 74 61 32 29 3b 0a 20 20 63 6b 73 75   pData2);.  cksu
37660 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
37670 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
37680 74 61 32 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  ta2);..  /* Even
37690 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
376a0 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
376b0 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c  rs while journal
376c0 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70 61  ling the.  ** pa
376d0 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  ge in the block 
376e0 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e  above, set the n
376f0 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f  eed-sync flag fo
37700 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  r the page..  **
37710 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
37720 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
37730 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
37740 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
37750 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
37760 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
37770 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
37780 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
37790 6f 72 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ored.  ** in the
377a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
377b0 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
377c0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
377d0 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a 20 74  doing so,.  ** t
377e0 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
377f0 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a  ay follow..  */.
37800 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
37810 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
37820 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
37830 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
37840 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  , iOff, pPg->pgn
37850 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
37860 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37870 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
37880 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
37890 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
378a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
378b0 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28  , iOff+4);.  if(
378c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
378d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
378e0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
378f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
37900 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
37910 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69  e+4, cksum);.  i
37920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37930 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
37940 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
37950 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
37960 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
37970 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
37980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37990 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
379a0 65 53 69 7a 65 29 29 3b 0a 20 20 50 41 47 45 52  eSize));.  PAGER
379b0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
379c0 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
379d0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
379e0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
379f0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
37a00 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
37a10 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
37a20 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
37a30 6f 2c 20 0a 20 20 20 20 20 20 20 28 28 70 50 67  o, .       ((pPg
37a40 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
37a50 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70  ED_SYNC)?1:0), p
37a60 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
37a70 67 29 29 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d  g)));..  pPager-
37a80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38  >journalOff += 8
37a90 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
37aa0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ize;.  pPager->n
37ab0 52 65 63 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  Rec++;.  assert(
37ac0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37ad0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d  nal!=0 );.  rc =
37ae0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
37af0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
37b00 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
37b10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 63  ;.  testcase( rc
37b20 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
37b30 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
37b40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
37b50 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
37b60 0a 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61  .  rc |= addToSa
37b70 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
37b80 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
37b90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
37ba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
37bb0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
37bc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37bd0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
37be0 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
37bf0 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
37c00 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
37c10 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
37c20 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
37c30 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
37c40 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
37c50 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
37c60 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
37c70 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
37c80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
37c90 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
37ca0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
37cb0 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
37cc0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
37cd0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
37ce0 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
37cf0 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
37d00 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
37d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37d20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
37d30 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
37d40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
37d50 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
37d60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
37d70 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
37d80 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75   is not called u
37d90 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72  nless a write-tr
37da0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
37db0 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e  ready .  ** been
37dc0 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f   started. The jo
37dd0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
37de0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
37df0 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  n at this point.
37e00 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  .  ** It is neve
37e10 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  r called in the 
37e20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a  ERROR state..  *
37e30 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
37e40 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37e50 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
37e60 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37e70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37e80 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
37e90 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37ea0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37eb0 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
37ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
37ed0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
37ee0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
37ef0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
37f00 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ode==0 );.  asse
37f10 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  rt( pPager->read
37f20 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 43 48 45  Only==0 );.  CHE
37f30 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
37f40 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
37f50 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
37f60 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20   opened. Higher 
37f70 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68  level routines h
37f80 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
37f90 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65   obtained the ne
37fa0 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f  cessary locks to
37fb0 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65   begin the write
37fc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75  -transaction, bu
37fd0 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62  t the.  ** rollb
37fe0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ack journal migh
37ff0 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65  t not yet be ope
38000 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69  n. Open it now i
38010 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
38020 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
38030 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
38040 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  e calling sqlite
38050 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
38060 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  () on the page. 
38070 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
38080 20 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65   if it were done
38090 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73   after calling s
380a0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
380b0 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20  Dirty(), then.  
380c0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68  ** an error migh
380d0 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20  t occur and the 
380e0 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20  pager would end 
380f0 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43  up in WRITER_LOC
38100 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77  KED state.  ** w
38110 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64  ith pages marked
38120 20 61 73 20 64 69 72 74 79 20 69 6e 20 74 68 65   as dirty in the
38130 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
38140 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
38150 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38160 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63  LOCKED ){.    rc
38170 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
38180 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
38190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
381a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
381b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
381c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
381d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
381e0 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  HEMOD );.  asser
381f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
38200 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
38210 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
38220 70 61 67 65 20 74 68 61 74 20 69 73 20 61 62 6f  page that is abo
38230 75 74 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  ut to be modifie
38240 64 20 61 73 20 64 69 72 74 79 2e 20 2a 2f 0a 20  d as dirty. */. 
38250 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
38260 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 0a 20  keDirty(pPg);.. 
38270 20 2f 2a 20 49 66 20 61 20 72 6f 6c 6c 62 61 63   /* If a rollbac
38280 6b 20 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6e 20  k journal is in 
38290 75 73 65 2c 20 74 68 65 6d 20 6d 61 6b 65 20 73  use, them make s
382a0 75 72 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ure the page tha
382b0 74 20 69 73 20 61 62 6f 75 74 0a 20 20 2a 2a 20  t is about.  ** 
382c0 74 6f 20 63 68 61 6e 67 65 20 69 73 20 69 6e 20  to change is in 
382d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
382e0 72 6e 61 6c 2c 20 6f 72 20 69 66 20 74 68 65 20  rnal, or if the 
382f0 70 61 67 65 20 69 73 20 61 20 6e 65 77 20 70 61  page is a new pa
38300 67 65 20 6f 66 66 0a 20 20 2a 2a 20 74 68 65 6e  ge off.  ** then
38310 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
38320 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  , make sure it i
38330 73 20 6d 61 72 6b 65 64 20 61 73 20 50 47 48 44  s marked as PGHD
38340 52 5f 4e 45 45 44 5f 53 59 4e 43 2e 0a 20 20 2a  R_NEED_SYNC..  *
38350 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
38360 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
38370 3d 30 29 20 3d 3d 20 69 73 4f 70 65 6e 28 70 50  =0) == isOpen(pP
38380 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
38390 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
383a0 6f 75 72 6e 61 6c 21 3d 30 0a 20 20 20 26 26 20  ournal!=0.   && 
383b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
383c0 74 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 72 2d  tNotNull(pPager-
383d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
383e0 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20 20 29 7b 0a  ->pgno)==0.  ){.
383f0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
38400 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
38410 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
38420 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
38430 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
38440 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41       rc = pagerA
38450 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b  ddPageToRollback
38460 4a 6f 75 72 6e 61 6c 28 70 50 67 29 3b 0a 20 20  Journal(pPg);.  
38470 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
38480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
38490 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
384a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
384b0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
384c0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
384d0 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20  RITER_DBMOD ){. 
384e0 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
384f0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
38500 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SYNC;.      }.  
38510 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
38520 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
38530 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
38540 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
38550 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
38560 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
38570 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
38580 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
38590 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
385a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
385b0 54 68 65 20 50 47 48 44 52 5f 44 49 52 54 59 20  The PGHDR_DIRTY 
385c0 62 69 74 20 69 73 20 73 65 74 20 61 62 6f 76 65  bit is set above
385d0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   when the page w
385e0 61 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  as added to the 
385f0 64 69 72 74 79 2d 6c 69 73 74 0a 20 20 2a 2a 20  dirty-list.  ** 
38600 61 6e 64 20 62 65 66 6f 72 65 20 77 72 69 74 69  and before writi
38610 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
38620 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
38630 75 72 6e 61 6c 2e 20 20 57 61 69 74 20 75 6e 74  urnal.  Wait unt
38640 69 6c 20 6e 6f 77 2c 0a 20 20 2a 2a 20 61 66 74  il now,.  ** aft
38650 65 72 20 74 68 65 20 70 61 67 65 20 68 61 73 20  er the page has 
38660 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
38670 79 20 6a 6f 75 72 6e 61 6c 6c 65 64 2c 20 62 65  y journalled, be
38680 66 6f 72 65 20 73 65 74 74 69 6e 67 20 74 68 65  fore setting the
38690 0a 20 20 2a 2a 20 50 47 48 44 52 5f 57 52 49 54  .  ** PGHDR_WRIT
386a0 45 41 42 4c 45 20 62 69 74 20 74 68 61 74 20 69  EABLE bit that i
386b0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
386c0 65 20 70 61 67 65 20 63 61 6e 20 62 65 20 73 61  e page can be sa
386d0 66 65 6c 79 20 6d 6f 64 69 66 69 65 64 2e 0a 20  fely modified.. 
386e0 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
386f0 20 7c 3d 20 50 47 48 44 52 5f 57 52 49 54 45 4