/ Hex Artifact Content
Login

Artifact fb3cd08ac0cb9918c77a46dbe51806977d17eaaf561d623ad95fd34b5ec86069:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8630: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8640: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8650: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8670: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8680: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8690: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
86a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
86b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
86c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
86d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28  pages */.  int (
86e0: 2a 78 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67  *xGet)(Pager*,Pg
86f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
8700: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  ; /* Routine to 
8710: 66 65 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f  fetch a patch */
8720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
8730: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
8740: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
8750: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
8760: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
8770: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
8780: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  a */.  void (*xC
8790: 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
87a0: 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a  id*,int,int); /*
87b0: 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20   Notify of page 
87c0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  size changes */.
87d0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
87e0: 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20  ree)(void*);    
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
8800: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63  ructor for the c
8810: 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  odec */.  void *
8820: 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20  pCodec;         
8830: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
8840: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
8850: 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  c... methods */.
8860: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
8870: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
8880: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
8890: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
88a0: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
88b0: 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  e */.  PCache *p
88c0: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
88d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
88e0: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
88f0: 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ct */.#ifndef SQ
8900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
8910: 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20  Wal *pWal;      
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
8930: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75  rite-ahead log u
8940: 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f  sed by "journal_
8950: 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63  mode=wal" */.  c
8960: 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20  har *zWal;      
8970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8980: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74  le name for writ
8990: 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23  e-ahead log */.#
89a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
89b0: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
89c0: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
89d0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
89e0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
89f0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
8a00: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
8a10: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
8a20: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8a30: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8a40: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8a50: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8a60: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8a70: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8a80: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8a90: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8aa0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ab0: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8ad0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8ae0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8af0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b00: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b10: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b20: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b30: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b40: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b50: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b60: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b70: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8b80: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8b90: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8ba0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8bc0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bd0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8be0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8bf0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c00: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c10: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c40: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c70: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8c80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8c90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8ca0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cb0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8cc0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cd0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ce0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8cf0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d00: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d10: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d20: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d30: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d40: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d50: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8d80: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8d90: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8da0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8db0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8dc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8dd0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8de0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e00: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e10: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e20: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e30: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e40: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e50: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8e80: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8e90: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ea0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8eb0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ec0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ed0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8ee0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8ef0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f10: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f20: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f30: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f40: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f50: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f60: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f70: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8f80: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8f90: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fa0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fc0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8fd0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8fe0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8ff0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9000: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9010: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9020: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9030: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9040: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9050: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9060: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9070: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
9080: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
9090: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90a0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90b0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90c0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90d0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
90e0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
90f0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9100: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9110: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9120: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9130: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9140: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9150: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9160: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9170: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
9180: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
9190: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91a0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91b0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91c0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
91e0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
91f0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9200: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9210: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9220: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9230: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9240: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9250: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9270: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9280: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9290: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92a0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92b0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92c0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
92e0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
92f0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9300: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9310: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9320: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9330: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9340: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9360: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9370: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9380: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9390: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93a0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93b0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93d0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
93e0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
93f0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9400: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9410: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9420: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9430: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9440: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9450: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9460: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9470: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9480: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94a0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94b0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94d0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
94e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
94f0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9500: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9510: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9520: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9530: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9540: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9550: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9560: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9570: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9580: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9590: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95a0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95b0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95c0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95d0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
95e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
95f0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9600: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9610: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9620: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9630: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9640: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9650: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9660: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9670: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
9680: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
9690: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96a0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96b0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96c0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96d0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
96e0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
96f0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9700: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9710: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9720: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9730: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9740: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9750: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9760: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9770: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
9780: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
9790: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97a0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97b0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97c0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97d0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
97e0: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
97f0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9800: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9810: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9820: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9830: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9840: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9850: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9870: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9880: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9890: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98a0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
98e0: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
98f0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9900: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9910: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9920: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9940: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9950: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9960: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9970: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9980: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9990: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99a0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99b0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99c0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99d0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
99e0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
99f0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a00: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a10: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a20: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a30: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a40: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a50: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a60: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a70: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9a80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9a90: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9aa0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ab0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ac0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9ad0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9ae0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9af0: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b00: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b10: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b20: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b30: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b40: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b50: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b60: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b70: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9b80: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9b90: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9ba0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bb0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9bc0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bd0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9be0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9bf0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c00: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c10: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c20: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c30: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c40: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c50: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c60: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c70: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9c80: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9c90: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9ca0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cb0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9cc0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9ce0: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9cf0: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d00: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d10: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d20: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d30: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d50: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d60: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d70: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9d80: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9d90: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9da0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9db0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9dc0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9dd0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9de0: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9df0: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e10: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e30: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e40: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e70: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9e80: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9e90: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ea0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9eb0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ec0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ed0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9ee0: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9ef0: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f00: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f10: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f20: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f30: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f40: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f50: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f60: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f70: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9f80: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9f90: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fa0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fb0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fc0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9fd0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
9fe0: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
9ff0: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a010: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a030: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a040: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a050: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a060: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a070: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a080: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a090: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0a0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0c0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a0e0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a0f0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a100: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a110: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a120: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a130: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a140: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a150: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a160: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a170: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a180: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a190: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1a0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1b0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1c0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1d0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a1e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a1f0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a200: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a210: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a220: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a230: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a240: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a250: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a260: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a270: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a280: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a290: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2a0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2b0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a2e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a2f0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a300: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a310: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a320: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a330: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a340: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a350: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a360: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a380: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a390: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3d0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a3e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a3f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a400: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a410: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a420: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a430: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a450: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a460: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a470: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a480: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a490: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4a0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4d0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a4e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a500: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a510: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a520: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a530: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a540: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a550: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a560: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a570: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a580: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a590: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5b0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a5f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a600: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a610: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a620: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a630: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a640: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a660: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a670: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a690: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6a0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6b0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6c0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6d0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a6e0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a6f0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a700: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a710: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a720: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a740: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a750: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a760: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a770: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a780: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a790: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7a0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a7e0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a800: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a810: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a820: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a840: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a850: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a860: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a870: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a880: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a890: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8d0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a8e0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a8f0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a900: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a910: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a920: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a930: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a940: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a950: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a960: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a970: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a980: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a990: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9c0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
a9e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
a9f0: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa00: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa10: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa30: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa40: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa50: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa60: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa70: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aa80: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aa90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aaa0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aac0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aad0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
aae0: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
aaf0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab00: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab10: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab20: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab50: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab60: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab70: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ab80: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
ab90: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
aba0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abb0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abc0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abd0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
abf0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac00: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac10: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac20: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac30: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac40: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac50: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac60: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac70: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
ac80: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
ac90: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
aca0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acb0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
acc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acd0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ace0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
acf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad00: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad10: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad20: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad30: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad40: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad50: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ad80: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
ad90: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ada0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
adb0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
adc0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
add0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ade0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
adf0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae00: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae10: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae20: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae30: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae40: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae50: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae60: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae70: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
ae80: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
ae90: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aea0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
aec0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aed0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
aee0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
aef0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
af00: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
af10: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
af20: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
af30: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
af40: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
af50: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
af60: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
af70: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
af80: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
af90: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
afa0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
afb0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
afc0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
afd0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
afe0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
aff0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b000: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b010: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b020: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b030: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b040: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b050: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b060: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b070: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b080: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b090: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b0a0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b0b0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b0c0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b0d0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b0e0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b0f0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b100: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b110: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b120: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b130: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b140: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b150: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b160: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b170: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b180: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b190: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b1a0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b1b0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b1c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b1d0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b1e0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b1f0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b200: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b210: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b220: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b230: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b240: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b250: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b260: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b270: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b280: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b290: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b2a0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b2b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b2c0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b2d0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b2e0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b2f0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b300: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b310: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b320: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b330: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b340: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b350: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b360: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b370: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b380: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b390: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3a0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b3b0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3e0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b3f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b400: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b410: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b420: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b430: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b440: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b450: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b460: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b470: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b480: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b490: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b4a0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b4b0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b4c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b4d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b4e0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b4f0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b500: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b510: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b520: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b530: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b540: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b550: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b560: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b570: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b580: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b590: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b5a0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b5b0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b5c0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b5d0: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b5e0: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b5f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b600: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b610: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b620: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b630: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b640: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b650: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b660: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b670: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b680: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b690: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6a0: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b6b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b6c0: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b6d0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b6e0: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b6f0: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b700: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b710: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b720: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b730: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b740: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b750: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b760: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b770: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b780: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b790: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b7a0: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b7b0: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b7c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b7d0: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b7e0: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b7f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b800: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b810: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b820: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b830: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b840: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b850: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b870: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b880: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b890: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b8a0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b8b0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b8c0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b8d0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b8e0: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b8f0: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b900: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b910: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b920: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b930: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b940: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
b950: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
b960: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
b970: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
b980: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b990: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b9a0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b9b0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b9c0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
b9e0: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
b9f0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ba00: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ba10: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
ba20: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
ba30: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
ba40: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
ba50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ba60: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ba70: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
ba80: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
ba90: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
baa0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bab0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bac0: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
bad0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bae0: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
baf0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bb20: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bb30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bb40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bb50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bb60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bb70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bb80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bb90: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bba0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bbb0: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bbc0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bbd0: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bbe0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bbf0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bc00: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bc10: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bc20: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bc30: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bc40: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bc50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bc60: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bc70: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bc80: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bc90: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bca0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bcb0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bcc0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bcf0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bd00: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bd10: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bd20: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bd30: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bd40: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
bd50: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
bd60: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bd70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
bd80: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
bd90: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
bda0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdb0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
bdc0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
bdd0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
bde0: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
bdf0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
be00: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
be10: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
be20: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
be30: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
be40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
be50: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
be60: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
be70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
be80: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
be90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bea0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
beb0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bec0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bed0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bee0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bef0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bf00: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bf10: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bf20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bf30: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bf40: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
bf50: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bf60: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bf70: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bf80: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bf90: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
bfa0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
bfb0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
bfc0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
bfd0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
bfe0: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
bff0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c000: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c010: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c020: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c030: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c040: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c050: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c060: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c070: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c080: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c090: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c0a0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c0b0: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c0c0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c0d0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c0e0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c0f0: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c100: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c110: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c130: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c140: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c150: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c160: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c170: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c180: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c190: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c1a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c1b0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c1c0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c1d0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c1e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c1f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c200: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c210: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c220: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c230: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c240: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c250: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c260: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c270: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c280: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c290: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c2a0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c2b0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c2c0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c2d0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c2e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c2f0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c310: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c320: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c330: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c340: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c350: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c360: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c370: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c380: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c390: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c3a0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c3b0: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c3c0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c3d0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c3e0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c3f0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c400: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c410: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c420: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c430: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c440: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c450: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c460: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c470: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c480: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c490: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c4a0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c4b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c4c0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c4d0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c4e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c4f0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c500: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c510: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c520: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c530: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c540: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c550: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c560: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c570: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c580: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c590: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c5a0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c5b0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c5c0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c5d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c5e0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c5f0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c600: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c610: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c620: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c630: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c640: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c650: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c660: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c670: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c680: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c690: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c6a0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c6b0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c6c0: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c6d0: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c6e0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c6f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c700: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c710: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c720: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c730: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c740: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c750: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c760: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c770: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c780: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c790: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c7a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c7b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c7c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c7d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c7e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c7f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c800: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c810: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c820: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c830: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c840: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c850: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c860: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c870: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c880: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c890: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c8b0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c8d0: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c8e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c8f0: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c900: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c910: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c920: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c930: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c940: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
c950: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
c960: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
c970: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
c980: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c990: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c9a0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c9b0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c9c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
c9d0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
c9e0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
c9f0: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
ca00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
ca10: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
ca20: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
ca30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ca50: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
ca60: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
ca70: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
ca80: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
ca90: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
caa0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cab0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6c  pPager->fd);.#el
cac0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
cad0: 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a 23  METER(pPager);.#
cae0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
caf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
cb00: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
cb10: 20 69 66 28 20 64 63 26 53 51 4c 49 54 45 5f 49   if( dc&SQLITE_I
cb20: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
cb30: 43 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  C ){.    return 
cb40: 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
cb50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cb60: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
cb70: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  E.  {.    int nS
cb80: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
cb90: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
cba0: 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
cbb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
cbc0: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
cbd0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
cbe0: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
cbf0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
cc00: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
cc10: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
cc20: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
cc30: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
cc40: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
cc50: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
cc60: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
cc70: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
cc80: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
cc90: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
cca0: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
ccb0: 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a  pPager);.#endif.
ccc0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ccd0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
cce0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
ccf0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
cd00: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
cd10: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
cd20: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
cd30: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
cd40: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
cd50: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
cd60: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
cd70: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
cd80: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
cd90: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
cda0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
cdb0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
cdc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
cdd0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
cde0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
cdf0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
ce00: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
ce10: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
ce20: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
ce30: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
ce40: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
ce50: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
ce60: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
ce70: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
ce80: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
ce90: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
cea0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
ceb0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
cec0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
ced0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
cee0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
cef0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
cf00: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
cf10: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
cf20: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
cf30: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
cf40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
cf50: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
cf60: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
cf70: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
cf80: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
cf90: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
cfa0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
cfb0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
cfc0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
cfd0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
cfe0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
cff0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
d000: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
d010: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
d020: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
d030: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
d040: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
d050: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
d060: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
d070: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
d080: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
d090: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d0a0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
d0b0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
d0c0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
d0d0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
d0e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
d0f0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
d100: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
d110: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
d120: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
d130: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
d140: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
d150: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
d160: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
d170: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
d180: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
d190: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
d1a0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
d1b0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
d1c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
d1d0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
d1e0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
d1f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
d200: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
d210: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d220: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
d230: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
d240: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
d250: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
d260: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
d270: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
d280: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
d290: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
d2a0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
d2b0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
d2c0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
d2d0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
d2e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
d2f0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
d300: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
d310: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
d320: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
d330: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
d340: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
d350: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
d360: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
d370: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
d380: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
d390: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
d3a0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
d3b0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
d3c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d3d0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
d3e0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
d3f0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
d400: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
d410: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
d420: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
d430: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
d440: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
d450: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
d460: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
d470: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
d480: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
d490: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
d4a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d4b0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
d4c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d4d0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
d4e0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
d4f0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
d500: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
d510: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
d520: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
d530: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
d540: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
d550: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
d560: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
d570: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
d580: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
d590: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
d5a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d5b0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
d5c0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
d5d0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
d5e0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
d5f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
d600: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
d610: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
d620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d630: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
d640: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
d650: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
d660: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
d670: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
d680: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
d690: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
d6a0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
d6b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d6c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d6d0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
d6e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
d6f0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
d700: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
d710: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d720: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d740: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
d750: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
d760: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
d770: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
d780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
d790: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
d7a0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
d7b0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
d7e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d7f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
d800: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
d810: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
d820: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
d830: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
d840: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d850: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d860: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d870: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d880: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d890: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d8a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d8b0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d8c0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d8d0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d8e0: 6c 65 6e 3e 73 7a 4a 2d 31 36 0a 20 20 20 7c 7c  len>szJ-16.   ||
d8f0: 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53   len==0 .   || S
d900: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d910: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d920: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
d930: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
d940: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d950: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
d960: 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29  Magic, 8, szJ-8)
d970: 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  ).   || memcmp(a
d980: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
d990: 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53  agic, 8).   || S
d9a0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d9b0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
d9c0: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
d9d0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a  n, szJ-16-len)).
d9e0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
d9f0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
da00: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
da10: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
da20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
da30: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
da40: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
da50: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
da60: 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r[u];.  }.  if( 
da70: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
da80: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
da90: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
daa0: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
dab0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
dac0: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
dad0: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
dae0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
daf0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
db00: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
db10: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
db20: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
db30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
db40: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
db50: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
db60: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
db70: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
db80: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  len = 0;.  }.  z
db90: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
dba0: 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e  0';.   .  return
dbb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
dbc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dbd0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65  offset of the se
dbe0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74  ctor boundary at
dbf0: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   or immediately 
dc00: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
dc10: 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65  e value in pPage
dc20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61  r->journalOff, a
dc30: 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72  ssuming a sector
dc40: 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61   .** size of pPa
dc50: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
dc60: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  bytes..**.** i.e
dc70: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
dc80: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
dc90: 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c     Pager.journal
dca0: 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74  Off          Ret
dcb0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d  urn value.**   -
dcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dce0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32        0.**   512
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 35 31 32 0a 2a 2a 20 20 20         512.**   
dd30: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
dd40: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
dd50: 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20     2000         
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
dd70: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
dd80: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  i64 journalHdrOf
dd90: 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  fset(Pager *pPag
dda0: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
ddb0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
ddc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ddd0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
dde0: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
ddf0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
de00: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
de10: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
de20: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
de30: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
de40: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
de50: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
de60: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
de70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
de80: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
de90: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
dea0: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65  ;.  return offse
deb0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
dec0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
ded0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
dee0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
def0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
df00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
df10: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f   no-op if the jo
df20: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e  urnal file has n
df30: 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ot been written 
df40: 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  to.** within the
df50: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
df60: 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61  tion (i.e. if Pa
df70: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  ger.journalOff==
df80: 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54  0)..**.** If doT
df90: 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a  runcate is non-z
dfa0: 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72  ero or the Pager
dfb0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
dfc0: 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a  t variable is.**
dfd0: 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20   set to 0, then 
dfe0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
dff0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72  rnal file to zer
e000: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
e010: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a   Otherwise,.** z
e020: 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20  ero the 28-byte 
e030: 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74  header at the st
e040: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
e050: 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68  al file. In eith
e060: 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20  er case, .** if 
e070: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
e080: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e090: 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
e0a0: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
e0b0: 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72  ely .** after wr
e0c0: 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  iting or truncat
e0d0: 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ing it..**.** If
e0e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
e0f0: 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74  zeLimit is set t
e100: 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f  o a positive, no
e110: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e  n-zero value, an
e120: 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  d.** following t
e130: 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72  he truncation or
e140: 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62   zeroing describ
e150: 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a  ed above the siz
e160: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75  e of the .** jou
e170: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
e180: 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  es is larger tha
e190: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68  n this value, th
e1a0: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  en truncate the.
e1b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
e1c0: 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  to Pager.journal
e1d0: 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e  SizeLimit bytes.
e1e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
e1f0: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65  e does.** not ne
e200: 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20  ed to be synced 
e210: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
e220: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
e230: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
e240: 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70  ccurs, abandon p
e250: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
e260: 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  turn the IO erro
e270: 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72  r code..** Other
e280: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  wise, return SQL
e290: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
e2a0: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
e2b0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
e2c0: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
e2d0: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
e2e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e310: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
e320: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e330: 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73  er->jfd) );.  as
e340: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a 6f  sert( !sqlite3Jo
e350: 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
e360: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
e370: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
e380: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
e390: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
e3a0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e3b0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
e3c0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
e3d0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
e3e0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
e3f0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
e400: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
e410: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
e420: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e430: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
e440: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
e450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e460: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e470: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
e480: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
e490: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
e4a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
e4b0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
e4c0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
e4d0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
e4e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
e4f0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
e500: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e510: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
e520: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
e530: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
e540: 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
e550: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
e560: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
e570: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
e580: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
e590: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
e5a0: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
e5b0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
e5c0: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
e5d0: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
e5e0: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
e5f0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
e600: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
e610: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
e620: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
e630: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
e640: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
e650: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
e660: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
e670: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
e680: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
e690: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
e6a0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
e6b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
e6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
e6d0: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
e6e0: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
e6f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
e700: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
e710: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
e720: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e730: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
e740: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e750: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
e760: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
e770: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
e780: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
e790: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
e7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
e7b0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
e7c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e7d0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
e7e0: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
e7f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
e800: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
e810: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e820: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
e830: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
e840: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
e850: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
e860: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
e870: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
e880: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
e890: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
e8a0: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
e8b0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
e8c0: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
e8d0: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
e8e0: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
e8f0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
e900: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
e910: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
e920: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
e930: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
e940: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
e950: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
e960: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
e970: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
e980: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
e990: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
e9a0: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
e9b0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
e9c0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
e9d0: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
e9e0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
e9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ea00: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
ea10: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ea20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ea30: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
ea40: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ea50: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
ea60: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
ea70: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
ea80: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
ea90: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
eaa0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
eab0: 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61  eader = (u32)pPa
eac0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a  ger->pageSize;/*
ead0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
eae0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
eaf0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
eb00: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb20: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
eb30: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
eb40: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
eb70: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
eb80: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
eb90: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
eba0: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
ebb0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
ebc0: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
ebd0: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
ebe0: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
ebf0: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
ec00: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ec10: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
ec20: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
ec30: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
ec40: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
ec50: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
ec60: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
ec70: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
ec80: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
ec90: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
eca0: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
ecb0: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
ecc0: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
ecd0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
ece0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
ecf0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
ed00: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
ed10: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
ed20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
ed30: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ed40: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
ed50: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ed60: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
ed70: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
ed80: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
ed90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
eda0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
edb0: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
edc0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
edd0: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
ede0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
edf0: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
ee00: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
ee10: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
ee20: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
ee30: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
ee40: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
ee50: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
ee60: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
ee70: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
ee80: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
ee90: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
eea0: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
eeb0: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
eec0: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
eed0: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
eee0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
eef0: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
ef00: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
ef10: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
ef20: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
ef30: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
ef40: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
ef50: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
ef60: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
ef70: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
ef80: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
ef90: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
efa0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
efb0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
efc0: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
efd0: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
efe0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
eff0: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
f000: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
f010: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
f020: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
f030: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
f040: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
f050: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
f060: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
f070: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
f080: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
f090: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
f0a0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
f0b0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
f0c0: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
f0d0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
f0e0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
f0f0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
f100: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
f110: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
f120: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
f130: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
f140: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
f150: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
f160: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
f170: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
f180: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
f190: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
f1a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
f1b0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
f1c0: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
f1d0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
f1e0: 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61  ->noSync || (pPa
f1f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
f200: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
f210: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
f220: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
f230: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
f240: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
f250: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
f260: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
f270: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
f280: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
f290: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
f2a0: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
f2b0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f2c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f2d0: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
f2e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
f2f0: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
f300: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
f310: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
f320: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
f330: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
f340: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20  nitializer */ . 
f350: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
f360: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
f370: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
f380: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f390: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
f3a0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f3b0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
f3c0: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
f3d0: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
f3e0: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
f3f0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
f400: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f410: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f420: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
f430: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
f440: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
f450: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
f460: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
f470: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f480: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f490: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
f4a0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
f4b0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
f4c0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
f4d0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f4e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f4f0: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
f500: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
f510: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
f520: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
f530: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
f540: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
f550: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
f560: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
f570: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
f580: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
f590: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
f5a0: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
f5b0: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
f5c0: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
f5d0: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
f5e0: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
f5f0: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
f600: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
f610: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
f620: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f630: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
f640: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
f650: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f660: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
f670: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
f680: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
f690: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
f6a0: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
f6b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
f6c0: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
f6d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
f6e0: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
f6f0: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
f700: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
f710: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
f720: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
f730: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
f740: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
f750: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
f760: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
f770: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
f780: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
f790: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
f7a0: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
f7b0: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
f7c0: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
f7d0: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
f7e0: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
f7f0: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
f800: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
f810: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
f820: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
f830: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
f840: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
f850: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
f860: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
f870: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
f880: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
f890: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
f8a0: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
f8b0: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
f8c0: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
f8d0: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
f8e0: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
f8f0: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
f900: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
f910: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
f920: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
f930: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
f940: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
f950: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
f960: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
f970: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
f980: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
f990: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
f9a0: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
f9b0: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
f9c0: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
f9d0: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
f9e0: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
f9f0: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
fa00: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
fa10: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
fa20: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
fa30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
fa40: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
fa50: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
fa60: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
fa70: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
fa80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa90: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
faa0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fab0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
fac0: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
fad0: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
fae0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
faf0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
fb00: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
fb10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
fb20: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
fb30: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
fb40: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
fb50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fb60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
fb70: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
fb80: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
fb90: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
fba0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
fbb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
fbc0: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
fbd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
fbe0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
fbf0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
fc00: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
fc10: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
fc20: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
fc30: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
fc40: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
fc50: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
fc60: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
fc70: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
fc80: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
fc90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fca0: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
fcb0: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
fcc0: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
fcd0: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
fce0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
fcf0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
fd00: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
fd10: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
fd20: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
fd30: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
fd40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
fd50: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
fd60: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
fd70: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
fd80: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
fd90: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
fda0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
fdb0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fdc0: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
fdd0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
fde0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
fdf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fe00: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
fe10: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
fe20: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
fe30: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
fe40: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
fe50: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
fe60: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
fe70: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
fe80: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
fe90: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
fea0: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
feb0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
fec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
fed0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
fee0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff00: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
ff10: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
ff20: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff40: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
ff50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
ff60: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
ff70: 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
ff80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
ff90: 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
ffa0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
ffb0: 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
ffc0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
ffd0: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
ffe0: 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
fff0: 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
10000 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10030 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
10040 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
10050 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
10060 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
10070 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
10080 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100a0 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
100b0 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
100c0 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
100d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
100e0 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
100f0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
10100 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
10110 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
10120 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
10130 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10140 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
10150 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
10160 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
10170 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
10180 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
10190 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
101a0 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
101b0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
101c0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
101d0 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
101e0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
101f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10200 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
10210 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10220 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
10230 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10240 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
10250 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10270 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
10280 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
10290 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
102a0 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
102b0 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
102c0 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
102d0 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
102e0 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
102f0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
10300 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
10310 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
10320 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
10330 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
10340 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
10350 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
10360 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
10370 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
10380 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
10390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
103a0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
103b0 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
103c0 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
103d0 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
103e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
103f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
10400 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
10410 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
10420 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
10430 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
10440 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
10450 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10460 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
10470 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
10480 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
10490 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
104a0 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
104b0 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
104c0 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
104d0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
104e0 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
104f0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
10500 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
10510 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
10520 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
10530 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
10540 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10550 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10560 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
10570 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
10580 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10590 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
105a0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
105b0 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
105c0 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
105d0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
105e0 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
105f0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10600 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
10610 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10620 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
10630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
10640 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
10650 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
10660 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
10670 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
10680 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
10690 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
106a0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
106b0 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
106c0 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
106d0 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  header */..    /
106e0 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
106f0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
10700 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
10710 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
10720 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
10730 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10740 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10750 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
10760 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
10770 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
10780 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
10790 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
107a0 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
107b0 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
107c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
107d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69   }..    /* Versi
107e0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
107f0 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74  ior to 3.5.8 set
10800 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66   the page-size f
10810 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ield of the.    
10820 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
10830 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68  r to zero. In th
10840 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20  is case, assume 
10850 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70  that the Pager.p
10860 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76  ageSize.    ** v
10870 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61  ariable is alrea
10880 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  dy set to the co
10890 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e  rrect page size.
108a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
108b0 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a  iPageSize==0 ){.
108c0 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20        iPageSize 
108d0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
108e0 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ze;.    }..    /
108f0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
10900 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
10910 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  m the page-size 
10920 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
10930 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72  fields.    ** ar
10940 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
10950 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27  To be 'in range'
10960 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65  , both values ne
10970 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
10980 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67  .    ** of two g
10990 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
109a0 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33  qual to 512 or 3
109b0 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74  2, and not great
109c0 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20  er than their . 
109d0 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65     ** respective
109e0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61   compile time ma
109f0 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20  ximum limits..  
10a00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10a10 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20  geSize<512      
10a20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69              || i
10a30 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20  SectorSize<32.  
10a40 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e     || iPageSize>
10a50 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10a60 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53  SIZE || iSectorS
10a70 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
10a80 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50  IZE.     || ((iP
10a90 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
10aa0 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28  Size)!=0   || ((
10ab0 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69  iSectorSize-1)&i
10ac0 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a  SectorSize)!=0 .
10ad0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
10ae0 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68  If the either th
10af0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73  e page-size or s
10b00 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68  ector-size in th
10b10 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10b20 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e   is .      ** in
10b30 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20  valid, then the 
10b40 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
10b50 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  te the journal-h
10b60 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20  eader must have 
10b70 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65  .      ** crashe
10b80 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61  d before the hea
10b90 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20  der was synced. 
10ba0 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f  In this case sto
10bb0 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20  p reading .     
10bc0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10bd0 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
10be0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
10bf0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
10c00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
10c10 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  te the page-size
10c20 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
10c30 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
10c40 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  e journal. .    
10c50 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73  ** Use a testcas
10c60 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b  e() macro to mak
10c70 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c  e sure that mall
10c80 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69  oc failure withi
10c90 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53  n .    ** PagerS
10ca0 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20  etPagesize() is 
10cb0 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tested..    */. 
10cc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10cd0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10ce0 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
10cf0 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  ze, -1);.    tes
10d00 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
10d10 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
10d20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
10d30 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
10d40 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
10d50 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
10d60 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
10d70 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
10d80 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
10d90 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
10da0 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
10db0 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
10dc0 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
10dd0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
10de0 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
10df0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
10e00 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
10e10 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
10e20 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
10e30 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
10e40 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
10e50 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
10e60 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
10e70 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
10e80 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
10e90 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
10ea0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10eb0 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
10ec0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
10ed0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
10ee0 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
10ef0 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
10f00 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
10f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
10f20 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
10f30 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
10f40 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
10f50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10f60 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
10f70 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
10f80 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
10f90 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
10fa0 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
10fb0 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
10fc0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
10fd0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
10fe0 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
10ff0 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
11000 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
11010 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
11020 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
11030 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
11040 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
11050 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
11060 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
11070 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
11080 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
11090 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
110a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
110b0 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
110c0 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
110d0 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
110e0 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
110f0 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
11100 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
11110 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
11120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
11130 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
11140 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
11150 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
11160 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
11170 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
11180 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
11190 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
111a0 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
111b0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
111c0 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
111d0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
111e0 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
111f0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
11200 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
11210 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
11220 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
11230 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
11240 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
11250 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
11260 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
11270 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11290 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
112a0 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
112d0 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
112e0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
11310 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
11320 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
11330 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11350 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
11360 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
11370 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11390 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
113a0 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
113b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
113c0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
113d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
113e0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
113f0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
11400 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  !zMaster .   || 
11410 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11420 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
11430 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
11440 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61    || !isOpen(pPa
11450 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20  ger->jfd).  ){. 
11460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11470 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
11480 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
11490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
114a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
114b0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
114c0 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
114d0 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
114e0 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
114f0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
11500 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
11510 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
11520 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
11530 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
11540 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
11550 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
11560 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
11570 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
11580 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
11590 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
115a0 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
115b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
115c0 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
115d0 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
115e0 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
115f0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
11600 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
11610 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
11620 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
11630 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
11640 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11650 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
11660 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
11670 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
11680 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11690 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
116a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
116b0 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
116c0 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
116d0 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
116e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
116f0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
11700 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
11710 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
11720 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11730 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11740 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
11750 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
11760 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
11770 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
11780 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11790 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
117a0 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
117b0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
117c0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
117d0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
117e0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
117f0 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
11800 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
11810 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
11820 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
11830 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
11840 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
11850 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
11860 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
11870 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
11880 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20 20  c, 8,.          
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b 34         iHdrOff+4
118b0 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
118c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
118d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
118e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
118f0 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
11900 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
11910 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
11920 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
11930 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
11940 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
11950 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
11960 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
11970 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
11980 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
11990 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
119a0 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
119b0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
119c0 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
119d0 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
119e0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
119f0 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
11a00 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
11a10 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
11a20 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
11a30 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
11a40 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
11a50 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
11a60 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
11a70 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
11a80 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
11a90 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
11aa0 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
11ab0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
11ac0 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
11ad0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
11ae0 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
11af0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
11b00 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11b10 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
11b20 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
11b30 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
11b40 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
11b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
11b60 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
11b70 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
11b80 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
11b90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11ba0 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20  .** Discard the 
11bb0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
11bc0 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
11bd0 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a   page-cache..*/.
11be0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11bf0 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
11c00 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72  Pager){.  pPager
11c10 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
11c20 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  ;.  sqlite3Backu
11c30 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
11c40 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c  >pBackup);.  sql
11c50 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
11c60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
11c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11c80 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44  n the pPager->iD
11c90 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65  ataVersion value
11ca0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50  .*/.u32 sqlite3P
11cb0 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28  agerDataVersion(
11cc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11cd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11ce0 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
11cf0 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  PEN );.  return 
11d00 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11d10 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  sion;.}../*.** F
11d20 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
11d30 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
11d40 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
11d50 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
11d60 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
11d70 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11d80 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11d90 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11da0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11db0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
11dc0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11dd0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
11de0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11df0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
11e00 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
11e10 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e30 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
11e40 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
11e50 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
11e60 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11e70 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11e80 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
11e90 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11ea0 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
11eb0 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
11ec0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
11ed0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
11ee0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
11ef0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
11f00 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73  Memory(pPager->s
11f10 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
11f20 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
11f30 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
11f40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
11f50 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
11f60 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
11f70 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11f80 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11f90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11fa0 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
11fb0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
11fc0 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
11fd0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
11fe0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
11ff0 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
12000 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
12010 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
12020 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
12030 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
12040 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
12050 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
12060 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12070 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
12080 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
12090 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
120a0 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
120c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
120d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
120e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
120f0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
12100 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
12110 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
12120 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
12130 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
12140 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
12150 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
12160 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
12170 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
12180 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
12190 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
121a0 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
121b0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
121c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
121d0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
121e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
121f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
12200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12220 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12230 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
12240 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
12250 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
12260 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52  not.** in the ER
12270 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
12280 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65  wise, it switche
12290 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50  s the pager to P
122a0 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61  AGER_OPEN.** sta
122b0 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
122c0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
122d0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
122e0 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61  s mode, the data
122f0 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20  base file is.** 
12300 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63  completely unloc
12310 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ked. If the file
12320 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64   is unlocked and
12330 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
12340 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68   does.** not exh
12350 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54  ibit the UNDELET
12360 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70  ABLE_WHEN_OPEN p
12370 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75  roperty, the jou
12380 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
12390 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73  closed (if it is
123a0 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66   open)..**.** If
123b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
123c0 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
123d0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
123e0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a  is called, the .
123f0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
12400 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61  he pager cache a
12410 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66  re discarded bef
12420 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61  ore switching ba
12430 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50  ck to .** the OP
12440 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64  EN state. Regard
12450 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
12460 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12470 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a  exclusive-mode.*
12480 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f  * or not, any jo
12490 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20  urnal file left 
124a0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
124b0 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74  em will be treat
124c0 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a  ed.** as a hot-j
124d0 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
124e0 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20  d back the next 
124f0 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e  time a read-tran
12500 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70  saction.** is op
12510 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72  ened (by this or
12520 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   by any other co
12530 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74  nnection)..*/.st
12540 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
12550 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
12560 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74  ager){..  assert
12570 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
12580 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
12590 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
125a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
125b0 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20  OPEN .       || 
125c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
125d0 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29  PAGER_ERROR .  )
125e0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ;..  sqlite3Bitv
125f0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
12600 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
12610 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
12620 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
12630 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
12640 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
12650 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
12660 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
12670 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
12680 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
12690 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
126a0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
126b0 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
126c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
126d0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65  PAGER_OPEN;.  }e
126e0 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
126f0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
12700 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
12730 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61  e returned by pa
12740 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f  gerUnlockDb() */
12750 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69  .    int iDc = i
12760 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
12770 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  )?sqlite3OsDevic
12780 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
12790 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a  (pPager->fd):0;.
127a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
127b0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
127c0 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e  support deletion
127d0 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20   of open files, 
127e0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73  then.    ** clos
127f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
12800 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
12810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
12820 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ck.  Otherwise. 
12830 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f     ** another co
12840 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
12850 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
12860 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74  e might delete t
12870 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f  he file.    ** o
12880 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
12890 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
128a0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
128b0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
128c0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
128d0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
128e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
128f0 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12900 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12910 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
12920 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  L      & 5)!=1 )
12930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12940 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12950 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d  _DELETE   & 5)!=
12960 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12970 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12980 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35  ODE_TRUNCATE & 5
12990 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
129a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
129b0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
129c0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69  & 5)==1 );.    i
129d0 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
129e0 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
129f0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
12a00 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
12a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
12a20 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
12a30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12a40 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
12a50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12a60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12a70 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12a80 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
12a90 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
12aa0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
12ab0 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20   fails, set the 
12ac0 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20  current lock to 
12ad0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
12ae0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20  e the comment.  
12af0 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23    ** above the #
12b00 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f  define for UNKNO
12b10 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
12b20 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68  xplanation of wh
12b30 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  y this.    ** is
12b40 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
12b50 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
12b60 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
12b70 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
12b80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12b90 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  K && pPager->eSt
12ba0 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
12bb0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12bc0 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57  ->eLock = UNKNOW
12bd0 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  N_LOCK;.    }.. 
12be0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
12bf0 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61  state may be cha
12c00 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f  nged from PAGER_
12c10 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f  ERROR to PAGER_O
12c20 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20  PEN here.    ** 
12c30 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67  without clearing
12c40 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
12c50 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69   This is intenti
12c60 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72  onal - the error
12c70 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20  .    ** code is 
12c80 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20  cleared and the 
12c90 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74  cache reset in t
12ca0 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a  he block below..
12cb0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12cc0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12cd0 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  de || pPager->eS
12ce0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
12cf0 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  R );.    pPager-
12d00 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12d10 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
12d20 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12d30 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OPEN;.  }..  /*
12d40 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
12d50 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
12d60 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12d70 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
12d80 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64   be.  ** trusted
12d90 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65  . Now that there
12da0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
12db0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
12dc0 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a  o the pager,.  *
12dd0 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20  * it can safely 
12de0 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47  move back to PAG
12df0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54  ER_OPEN state. T
12e00 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62  his happens in b
12e10 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  oth.  ** normal 
12e20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f  and exclusive-lo
12e30 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f  cking mode..  */
12e40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12e50 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12e60 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
12e70 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
12e80 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
12e90 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
12ea0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
12eb0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
12ec0 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
12ed0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12ee0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  one = 0;.      p
12ef0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12f00 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
12f10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
12f20 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69  ger->eState = (i
12f30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
12f40 64 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20  d) ? PAGER_OPEN 
12f50 3a 20 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b  : PAGER_READER);
12f60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55  .    }.    if( U
12f70 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
12f80 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
12f90 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
12fa0 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72  , 0);.    pPager
12fb0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
12fc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65  TE_OK;.    setGe
12fd0 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
12fe0 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  r);.  }..  pPage
12ff0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13000 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
13010 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
13020 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
13030 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
13040 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13050 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
13060 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
13070 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
13080 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
13090 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
130a0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
130b0 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
130c0 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
130d0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
130e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
130f0 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
13100 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
13110 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
13120 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
13130 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
13140 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
13150 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
13160 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
13170 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
13180 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
13190 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
131a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
131b0 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
131c0 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
131d0 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
131e0 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
131f0 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
13200 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
13210 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
13220 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
13230 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
13240 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
13250 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
13260 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
13270 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
13280 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
13290 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
132a0 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
132b0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
132c0 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
132d0 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
132e0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
132f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
13300 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
13310 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
13320 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
13330 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
13340 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
13350 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
13360 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
13370 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
13380 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
13390 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
133a0 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
133b0 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
133c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
133d0 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
133e0 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
133f0 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
13400 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
13410 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
13420 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
13430 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
13440 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13450 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
13460 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
13470 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
13480 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
13490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
134a0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
134b0 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
134c0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
134d0 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
134e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
134f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
13500 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
13510 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
13520 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
13530 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
13540 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
13550 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
13560 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
13570 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
13580 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
13590 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20  PAGER_ERROR;.   
135a0 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
135b0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
135c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
135d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
135e0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
135f0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
13600 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  e);../*.** The w
13610 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
13620 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20   open on pPager 
13630 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
13640 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a  ed (bCommit==1).
13650 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ** or rolled bac
13660 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a  k (bCommit==0)..
13670 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
13680 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  E if and only if
13690 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
136a0 20 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68   should be flush
136b0 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
136c0 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  * Rules:.**.**  
136d0 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50   *  For non-TEMP
136e0 20 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61   databases, alwa
136f0 79 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e  ys sync to disk.
13700 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
13710 61 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20  ary.**      for 
13720 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20  transactions to 
13730 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a  be durable..**.*
13740 2a 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50  *   *  Sync TEMP
13750 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f   database only o
13760 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20  n a COMMIT (not 
13770 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e  a ROLLBACK) when
13780 20 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20   the backing.** 
13790 20 20 20 20 20 66 69 6c 65 20 68 61 73 20 62 65       file has be
137a0 65 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65 61  en created alrea
137b0 64 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20  dy (via a spill 
137c0 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28 29  on pagerStress()
137d0 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68  ) and.**      wh
137e0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
137f0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
13800 6d 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32  memory exceeds 2
13810 35 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a  5% of the total.
13820 2a 2a 20 20 20 20 20 20 63 61 63 68 65 20 73 69  **      cache si
13830 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
13840 74 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f  t pagerFlushOnCo
13850 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
13860 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
13870 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
13880 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65  tempFile==0 ) re
13890 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62  turn 1;.  if( !b
138a0 43 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20  Commit ) return 
138b0 30 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  0;.  if( !isOpen
138c0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72  (pPager->fd) ) r
138d0 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
138e0 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68 65  n (sqlite3PCache
138f0 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50 61  PercentDirty(pPa
13900 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32  ger->pPCache)>=2
13910 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  5);.}../*.** Thi
13920 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
13930 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
13940 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
13950 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
13960 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
13970 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
13980 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
13990 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
139a0 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
139b0 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
139c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
139d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
139e0 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
139f0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
13a00 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
13a10 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
13a20 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
13a30 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
13a40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
13a50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13a60 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
13a70 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
13a80 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63  tate. If it is c
13a90 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45  alled.** in PAGE
13aa0 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f  R_NONE or PAGER_
13ab0 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64  SHARED state and
13ac0 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69   the lock held i
13ad0 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73  s less.** exclus
13ae0 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52  ive than a RESER
13af0 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  VED lock, it is 
13b00 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f  a no-op..**.** O
13b10 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
13b20 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
13b30 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
13b40 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
13b50 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
13b60 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
13b70 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
13b80 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
13b90 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
13ba0 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
13bb0 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
13bc0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
13bd0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
13be0 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
13bf0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
13c00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
13c10 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
13c20 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
13c30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
13c40 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
13c50 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
13c60 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
13c70 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
13c80 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
13c90 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13ca0 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
13cb0 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
13cc0 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
13cd0 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
13ce0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
13cf0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
13d00 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
13d10 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
13d20 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
13d30 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
13d40 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
13d50 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
13d60 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
13d70 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
13d80 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
13d90 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
13da0 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
13db0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
13dc0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13dd0 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
13de0 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
13df0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13e00 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
13e10 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
13e20 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
13e30 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
13e40 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
13e50 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
13e60 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
13e70 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
13e80 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
13e90 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
13ea0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
13eb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
13ec0 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
13ed0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
13ee0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
13ef0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
13f00 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
13f10 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
13f20 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
13f30 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
13f40 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
13f50 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
13f60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13f70 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
13f80 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
13f90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
13fa0 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
13fb0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
13fc0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
13fd0 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
13fe0 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
13ff0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
14000 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
14010 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
14020 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
14030 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74   is finalized, t
14040 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
14050 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
14060 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e  tate..** If runn
14070 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
14080 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f  sive rollback mo
14090 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  de, the lock on 
140a0 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20  the file is .** 
140b0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
140c0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
140d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
140e0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
140f0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20  rror occurs. If 
14100 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
14110 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66  during.** any of
14120 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f   the IO operatio
14130 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ns to finalize t
14140 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14150 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a  or unlock the.**
14160 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74   database then t
14170 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
14180 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
14190 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65  the user. If the
141a0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74   .** operation t
141b0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
141c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
141d0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65  s, then the code
141e0 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20   still.** tries 
141f0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
14200 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e  tabase file if n
14210 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
14220 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  mode. If the.** 
14230 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
14240 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20   fails as well, 
14250 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65  then the first e
14260 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65  rror code relate
14270 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
14280 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
14290 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c  red (the journal
142a0 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e   finalization on
142b0 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  e) is.** returne
142c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
142d0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
142e0 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
142f0 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73  ager, int hasMas
14300 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  ter, int bCommit
14310 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14320 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
14330 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
14340 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
14350 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ation operation 
14360 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53  */.  int rc2 = S
14370 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
14380 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
14390 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20   db file unlock 
143a0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
143b0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
143c0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
143d0 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e  not have an open
143e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
143f0 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65  on.  ** or at le
14400 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
14410 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ock. This functi
14420 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
14430 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a   when there.  **
14440 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
14450 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20  nsaction active 
14460 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f  but a RESERVED o
14470 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
14480 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65  s.  ** held unde
14490 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  r two circumstan
144a0 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ces:.  **.  **  
144b0 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63   1. After a succ
144c0 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e  essful hot-journ
144d0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20  al rollback, it 
144e0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20  is called with. 
144f0 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d   **      eState=
14500 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20  =PAGER_NONE and 
14510 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
14520 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  _LOCK..  **.  **
14530 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65     2. If a conne
14540 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69  ction with locki
14550 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14560 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
14570 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20  LUSIVE .  **    
14580 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20    lock switches 
14590 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f  back to locking_
145a0 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20  mode=normal and 
145b0 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a  then executes a.
145c0 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74    **      read-t
145d0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
145e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
145f0 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d  led with eState=
14600 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
14610 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f   **      and eLo
14620 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
14630 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  CK when the read
14640 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
14650 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  closed..  */.  a
14660 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
14670 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
14680 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
14690 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
146a0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
146b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
146c0 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f  te<PAGER_WRITER_
146d0 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72  LOCKED && pPager
146e0 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44  ->eLock<RESERVED
146f0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
14700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14710 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   }..  releaseAll
14720 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
14730 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r);.  assert( is
14740 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
14750 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
14760 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20  Journal==0 .    
14770 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
14780 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
14790 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
147a0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
147b0 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b  TCH_ATOMIC).  );
147c0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
147d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
147e0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
147f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
14800 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
14810 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
14820 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
14830 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73  sqlite3JournalIs
14840 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  InMemory(pPager-
14850 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f  >jfd) ){.      /
14860 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72  * assert( pPager
14870 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14880 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14890 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20  _MEMORY ); */.  
148a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
148b0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
148c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
148d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
148e0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
148f0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
14900 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
14910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
14930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14960 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
14970 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
14980 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14990 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
149a0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
149b0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
149c0 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73  e the new file s
149d0 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  ize is written i
149e0 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69  nto the inode ri
149f0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20  ght away..      
14a00 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
14a10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
14a20 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c  ht resurrect fol
14a30 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c  lowing a power l
14a40 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  oss and.        
14a50 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c    ** cause the l
14a60 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ast transaction 
14a70 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53  to roll back.  S
14a80 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ee.          ** 
14a90 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
14aa0 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f  .mozilla.org/sho
14ab0 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37  w_bug.cgi?id=107
14ac0 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a  2773.          *
14ad0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
14ae0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
14af0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
14b00 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
14b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14b20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14b30 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
14b40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
14b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14b60 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14b70 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
14b80 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
14b90 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
14ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14bb0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
14bc0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
14bd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
14be0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
14bf0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c  ger, hasMaster||
14c00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14c10 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
14c20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
14c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14c40 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14c50 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
14c60 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
14c70 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
14c80 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
14c90 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
14ca0 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
14cb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14cc0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14cd0 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
14ce0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
14cf0 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
14d00 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
14d10 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
14d20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
14d30 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
14d40 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
14d50 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
14d60 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
14d70 74 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65  te = !pPager->te
14d80 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73  mpFile;.      as
14d90 73 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75  sert( sqlite3Jou
14da0 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14db0 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29  Pager->jfd)==0 )
14dc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14dd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14de0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14df0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
14e00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14e10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14e20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14e30 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
14e40 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
14e50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14e60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14e70 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
14e80 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
14e90 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
14ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
14eb0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
14ec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
14ed0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
14ee0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
14ef0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72  al, pPager->extr
14f00 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  aSync);.      }.
14f10 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
14f20 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
14f30 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
14f40 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
14f50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14f60 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
14f70 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
14f80 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
14f90 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
14fa0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
14fb0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
14fc0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
14fd0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
14fe0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
14ff0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
15000 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
15010 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
15020 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
15030 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
15040 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
15050 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
15060 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
15070 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
15080 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
15090 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
150a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
150b0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45  OK ){.    if( ME
150c0 4d 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73  MDB || pagerFlus
150d0 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  hOnCommit(pPager
150e0 2c 20 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  , bCommit) ){.  
150f0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15100 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
15110 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
15120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
15130 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 57  ite3PcacheClearW
15140 72 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e  ritable(pPager->
15150 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a  pPCache);.    }.
15160 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15170 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
15180 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
15190 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
151a0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
151b0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
151c0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41    /* Drop the WA
151d0 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66  L write-lock, if
151e0 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74   any. Also, if t
151f0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
15200 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  s in .    ** loc
15210 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
15220 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
15230 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20  no longer, drop 
15240 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20  the EXCLUSIVE . 
15250 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20     ** lock held 
15260 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15270 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
15280 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61   rc2 = sqlite3Wa
15290 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63  lEndWriteTransac
152a0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
152b0 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
152c0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
152d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
152e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
152f0 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72  Commit && pPager
15300 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61  ->dbFileSize>pPa
15310 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
15320 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
15330 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
15340 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
15350 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c  nsaction in roll
15360 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  back-journal.   
15370 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20   ** mode if the 
15380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
15390 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20   disk is larger 
153a0 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
153b0 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20  e image..    ** 
153c0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
153d0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
153e0 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
153f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15400 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73   .    ** success
15410 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c  fully committed,
15420 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49   but the EXCLUSI
15430 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c  VE lock is still
15440 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20   held on the.   
15450 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20   ** file. So it 
15460 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63  is safe to trunc
15470 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
15480 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e   file to its min
15490 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75  imum.    ** requ
154a0 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  ired size.  */. 
154b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
154c0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
154d0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
154e0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
154f0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
15500 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
15510 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15520 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
15530 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
15540 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63  r->fd) ){.    rc
15550 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15560 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
15570 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
15580 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f  _COMMIT_PHASETWO
15590 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
155a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
155b0 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
155c0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
155d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
155e0 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70  eMode .   && (!p
155f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
15600 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c  r) || sqlite3Wal
15610 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
15620 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a  ager->pWal, 0)).
15630 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70    ){.    rc2 = p
15640 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
15650 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
15660 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
15670 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
15680 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
15690 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
156a0 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65  _READER;.  pPage
156b0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
156c0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
156d0 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
156e0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  c);.}../*.** Exe
156f0 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
15700 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
15710 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
15720 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
15730 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
15740 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
15750 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
15760 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
15770 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
15780 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
15790 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
157a0 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
157b0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
157c0 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
157d0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
157e0 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
157f0 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
15800 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
15810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15820 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  le and move the 
15830 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50  pager back to OP
15840 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  EN state. If thi
15850 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  s .** means that
15860 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d   there is a hot-
15870 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20  journal left in 
15880 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
15890 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f   the next .** co
158a0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  nnection to obta
158b0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
158c0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77   on the pager (w
158d0 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73  hich may be this
158e0 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72   one) .** will r
158f0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
15900 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
15910 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
15920 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
15930 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20  R state, but an 
15940 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  IO or.** malloc 
15950 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15960 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
15970 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69  then this will i
15980 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20  tself cause .** 
15990 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
159a0 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  er the ERROR sta
159b0 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62  te. Which will b
159c0 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  e cleared by the
159d0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
159e0 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64  r_unlock(), as d
159f0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
15a00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
15a10 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
15a20 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
15a30 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
15a40 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
15a50 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65  R_ERROR && pPage
15a60 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
15a70 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73  _OPEN ){.    ass
15a80 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
15a90 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
15aa0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
15ab0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
15ac0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
15ad0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
15ae0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
15af0 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
15b00 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
15b10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
15b20 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
15b30 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc();.    }els
15b40 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
15b50 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
15b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15b70 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
15b80 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
15b90 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
15ba0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
15bb0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
15bc0 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
15bd0 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
15be0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
15bf0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
15c00 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
15c10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
15c20 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
15c30 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
15c40 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
15c50 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
15c60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
15c70 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
15c80 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
15c90 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
15ca0 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
15cb0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
15cc0 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
15cd0 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
15ce0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
15cf0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
15d00 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
15d10 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
15d20 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
15d30 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
15d40 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
15d50 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
15d60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15d70 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
15d80 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
15d90 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
15da0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
15db0 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
15dc0 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
15dd0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
15de0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
15df0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
15e00 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
15e10 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
15e20 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
15e30 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
15e40 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
15e50 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
15e60 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
15e70 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
15e80 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
15e90 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
15ea0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
15eb0 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
15ec0 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
15ed0 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
15ee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
15ef0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
15f00 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
15f10 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
15f20 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
15f30 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
15f40 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
15f50 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
15f60 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
15f70 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
15f80 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
15f90 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
15fa0 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
15fb0 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
15fc0 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
15fd0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
15fe0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
15ff0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
16000 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
16010 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
16020 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
16030 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
16040 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
16050 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
16060 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
16070 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
16080 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
16090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
160a0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
160b0 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
160c0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
160d0 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
160e0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
160f0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16100 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
16110 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
16120 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
16130 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
16140 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
16150 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
16160 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
16170 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
16180 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
161b0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
161c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
161d0 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
161e0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
161f0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
16200 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
16210 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23  dec */.#endif..#
16220 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16230 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _CODEC./*.** Mak
16240 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  e sure the numbe
16250 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69  r of reserved bi
16260 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69  ts is the same i
16270 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  n the destinatio
16280 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74  n.** pager as it
16290 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63   is in the sourc
162a0 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75  e.  This comes u
162b0 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20  p when a VACUUM 
162c0 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e  changes the.** n
162d0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
162e0 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f  d bits to the "o
162f0 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a  ptimal" amount..
16300 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
16310 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65  agerAlignReserve
16320 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50  (Pager *pDest, P
16330 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69  ager *pSrc){.  i
16340 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72  f( pDest->nReser
16350 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72  ve!=pSrc->nReser
16360 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d  ve ){.    pDest-
16370 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63  >nReserve = pSrc
16380 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
16390 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
163a0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pDest);.  }.}.#e
163b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
163c0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
163d0 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
163e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
163f0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
16400 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
16410 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
16420 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
16430 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
16440 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
16450 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
16460 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
16470 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
16480 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
16490 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
164a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
164b0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
164c0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
164d0 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
164e0 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20  ck journal uses 
164f0 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
16500 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16510 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a  l does .** not..
16520 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16530 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16540 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
16550 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
16560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
16570 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16580 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
16590 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
165a0 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
165b0 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
165c0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
165d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
165e0 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
165f0 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
16600 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
16610 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
16620 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
16630 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
16640 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
16650 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
16660 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
16670 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
16680 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
16690 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
166a0 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
166b0 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
166c0 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
166d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
166e0 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
166f0 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
16700 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
16710 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
16720 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
16730 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
16740 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
16750 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
16760 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
16770 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
16780 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
16790 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
167a0 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
167b0 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
167c0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
167d0 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
167e0 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
167f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
16800 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
16810 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
16820 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
16830 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
16840 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
16850 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
16860 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
16870 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
16880 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
16890 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
168a0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
168b0 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
168c0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
168d0 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
168e0 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
168f0 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
16900 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
16910 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
16920 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
16930 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
16940 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
16950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
16960 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
16970 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
16980 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
16990 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
169a0 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
169b0 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
169c0 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
169d0 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
169e0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
169f0 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
16a00 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16a10 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
16a20 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
16a30 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
16a40 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
16a50 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
16a60 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
16a70 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
16a80 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
16a90 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
16aa0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
16ab0 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
16ac0 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
16ad0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16af0 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
16b00 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
16b10 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b30 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
16b40 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
16b50 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
16b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16b70 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
16b80 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
16b90 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
16ba0 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
16bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
16bc0 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
16bd0 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
16be0 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
16bf0 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
16c00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
16c10 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
16c20 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
16c30 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
16c40 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
16c50 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
16c60 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
16c70 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
16c80 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
16c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16ca0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
16cb0 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
16cc0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
16cd0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
16ce0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
16cf0 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
16d00 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
16d10 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d30 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
16d40 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
16d50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16d60 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
16d70 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
16d80 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
16d90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
16da0 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
16db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16dc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
16dd0 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
16de0 63 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ced */.#ifdef SQ
16df0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
16e00 20 2f 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20   /* The jrnlEnc 
16e10 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
16e20 4a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 73 68  Journal pages sh
16e30 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74  ould be passed t
16e40 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20  hrough.  ** the 
16e50 63 6f 64 65 63 2e 20 20 49 74 20 69 73 20 66 61  codec.  It is fa
16e60 6c 73 65 20 66 6f 72 20 70 75 72 65 20 69 6e 2d  lse for pure in-
16e70 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e  memory journals.
16e80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
16e90 6a 72 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69  jrnlEnc = (isMai
16ea0 6e 4a 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d  nJrnl || pPager-
16eb0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30  >subjInMemory==0
16ec0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
16ed0 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
16ee0 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
16ef0 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
16f00 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
16f10 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
16f20 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
16f30 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
16f40 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
16f50 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
16f60 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
16f70 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
16f80 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
16f90 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
16fa0 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
16fb0 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
16fc0 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
16fd0 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
16fe0 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
16ff0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17000 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
17010 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
17020 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
17030 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
17040 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
17050 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
17060 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
17070 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e  0 || (!isMainJrn
17080 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20  l && isSavepnt) 
17090 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20  );..  /* Either 
170a0 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65  the state is gre
170b0 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f  ater than PAGER_
170c0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
170d0 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  (a transaction .
170e0 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
170f0 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20  t rollback done 
17100 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f  at the request o
17110 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72  f the caller) or
17120 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20   this is.  ** a 
17130 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17140 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61  back. If it is a
17150 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
17160 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72  lback, the pager
17170 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74  .  ** is in stat
17180 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73  e OPEN and holds
17190 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
171a0 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ck. Hot-journal 
171b0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e  rollback.  ** on
171c0 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68  ly reads from th
171d0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  e main journal, 
171e0 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  not the sub-jour
171f0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
17200 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
17210 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
17220 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
17230 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74   || (pPager->eSt
17240 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
17250 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
17260 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17270 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ).  );.  assert(
17280 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
17290 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
172a0 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e  CHEMOD || isMain
172b0 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  Jrnl );..  /* Re
172c0 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
172d0 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
172e0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
172f0 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
17300 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
17310 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
17320 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
17330 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
17340 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
17350 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
17360 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
17370 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
17380 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
17390 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
173a0 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
173b0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
173c0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
173d0 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
173e0 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
173f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
17400 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
17410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17420 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17430 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
17440 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
17450 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
17460 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
17470 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
17480 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
17490 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
174a0 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
174b0 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
174c0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
174d0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
174e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
174f0 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
17500 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
17510 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
17520 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
17530 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
17540 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
17550 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
17560 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
17570 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
17580 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
17590 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
175a0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
175b0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
175c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
175d0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
175e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
175f0 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
17600 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
17610 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
17620 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
17630 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
17640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17650 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
17660 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
17670 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
17680 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
17690 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
176a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
176b0 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
176c0 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
176d0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
176e0 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  *)aData)!=cksum 
176f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17700 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
17710 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
17720 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c  this page has al
17730 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
17740 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75  d back before du
17750 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
17760 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
17770 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
17780 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
17790 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
177a0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
177b0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
177c0 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
177d0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
177e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
177f0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
17800 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
17810 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
17820 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
17830 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
17840 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
17850 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
17860 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
17870 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17880 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
17890 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
178a0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
178b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
178c0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
178d0 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
178e0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
178f0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
17900 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
17910 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
17920 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
17930 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
17940 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
17950 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
17960 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
17970 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
17980 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
17990 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
179a0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
179b0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
179c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
179d0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
179e0 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
179f0 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
17a00 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
17a10 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
17a20 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
17a30 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
17a40 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
17a50 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
17a60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
17a70 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
17a80 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
17a90 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
17aa0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
17ab0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
17ac0 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
17ad0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
17ae0 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
17af0 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
17b00 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
17b10 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
17b20 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
17b30 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
17b40 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
17b50 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
17b60 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
17b70 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
17b80 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
17b90 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
17ba0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
17bb0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
17bc0 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
17bd0 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
17be0 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
17bf0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
17c00 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
17c10 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
17c20 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
17c30 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
17c40 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
17c50 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
17c60 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
17c70 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
17c80 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
17c90 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
17ca0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
17cb0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
17cc0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
17cd0 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
17ce0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17cf0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
17d00 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
17d10 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
17d20 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
17d30 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
17d40 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
17d50 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
17d60 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
17d70 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
17d80 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
17d90 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
17da0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
17db0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
17dc0 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
17dd0 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
17de0 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
17df0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
17e00 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
17e10 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
17e20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
17e30 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
17e40 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
17e50 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
17e60 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
17e70 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
17e80 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
17e90 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
17ea0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
17eb0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
17ec0 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
17ed0 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
17ee0 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
17ef0 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
17f00 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
17f10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17f20 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
17f30 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
17f40 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
17f50 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
17f60 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
17f70 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
17f80 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
17f90 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
17fa0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
17fb0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17fc0 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
17fd0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
17fe0 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
17ff0 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
18000 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
18010 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
18020 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
18030 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
18040 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
18050 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
18060 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
18070 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
18080 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
18090 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
180a0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
180b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
180c0 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
180d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
180e0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
180f0 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
18100 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
18110 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
18120 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
18130 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  , pgno);.  }.  a
18140 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
18150 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
18160 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
18170 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  !=PAGER_OPEN || 
18180 70 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  pPg==0 || pPager
18190 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
181a0 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
181b0 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
181c0 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
181d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
181e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
181f0 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
18200 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
18210 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
18220 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
18230 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
18240 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
18250 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
18260 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
18270 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
18280 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
18290 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
182a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
182b0 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
182c0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
182d0 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
182e0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
182f0 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
18300 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
18310 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
18320 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
18330 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
18340 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
18350 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
18360 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
18370 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
18380 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
18390 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
183a0 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
183b0 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
183c0 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
183d0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
183e0 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
183f0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
18400 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18410 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ;..    /* Write 
18420 74 68 65 20 64 61 74 61 20 72 65 61 64 20 66 72  the data read fr
18430 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  om the journal b
18440 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
18450 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
18460 2a 2a 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  ** This is usual
18470 6c 79 20 73 61 66 65 20 65 76 65 6e 20 66 6f 72  ly safe even for
18480 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
18490 74 61 62 61 73 65 20 2d 20 61 73 20 74 68 65 20  tabase - as the 
184a0 64 61 74 61 0a 20 20 20 20 2a 2a 20 77 61 73 20  data.    ** was 
184b0 65 6e 63 72 79 70 74 65 64 20 62 65 66 6f 72 65  encrypted before
184c0 20 69 74 20 77 61 73 20 77 72 69 74 74 65 6e 20   it was written 
184d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
184e0 69 6c 65 2e 20 54 68 65 20 65 78 63 65 70 74 69  ile. The excepti
184f0 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 69 66 20  on.    ** is if 
18500 74 68 65 20 64 61 74 61 20 77 61 73 20 6a 75 73  the data was jus
18510 74 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 69  t read from an i
18520 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
18530 72 6e 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20  rnal. In that.  
18540 20 20 2a 2a 20 63 61 73 65 20 69 74 20 6d 75 73    ** case it mus
18550 74 20 62 65 20 65 6e 63 72 79 70 74 65 64 20 68  t be encrypted h
18560 65 72 65 20 62 65 66 6f 72 65 20 69 74 20 69 73  ere before it is
18570 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
18580 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
18590 20 66 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65   file.  */.#ifde
185a0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
185b0 45 43 0a 20 20 20 20 69 66 28 20 21 6a 72 6e 6c  EC.    if( !jrnl
185c0 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  Enc ){.      COD
185d0 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
185e0 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
185f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
18600 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , aData);.      
18610 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
18620 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
18630 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
18640 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
18650 66 73 74 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  fst);.      CODE
18660 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
18670 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
18680 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
18690 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
186a0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
186b0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
186c0 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61  r->fd, (u8 *)aDa
186d0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
186e0 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20  Size, ofst);..  
186f0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
18700 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
18710 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18720 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
18730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18740 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
18750 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
18760 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
18770 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a   if( jrnlEnc ){.
18780 20 20 20 20 20 20 20 20 43 4f 44 45 43 31 28 70          CODEC1(p
18790 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
187a0 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
187b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
187c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
187d0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
187e0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
187f0 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
18800 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
18810 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18820 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
18830 4f 4d 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29  OMEM_BKPT,aData)
18840 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
18850 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
18860 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
18870 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
18880 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
18890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
188a0 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
188b0 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
188c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
188d0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
188e0 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
188f0 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
18900 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
18910 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
18920 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
18930 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
18940 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
18950 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
18960 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
18970 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
18980 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
18990 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
189a0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
189b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
189c0 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
189d0 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
189e0 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
189f0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
18a00 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
18a10 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
18a20 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
18a30 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
18a40 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
18a50 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
18a60 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
18a70 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
18a80 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
18a90 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
18aa0 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
18ab0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18ac0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
18ad0 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
18ae0 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
18af0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
18b00 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
18b10 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
18b20 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
18b30 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
18b40 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
18b50 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
18b60 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
18b70 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
18b80 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
18b90 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
18ba0 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
18bb0 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
18bc0 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
18bd0 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
18be0 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
18bf0 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
18c00 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
18c10 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
18c20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
18c30 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
18c40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
18c50 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18c60 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
18c70 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
18c80 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
18c90 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
18ca0 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
18cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18cc0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
18cd0 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  o, &pPg, 1);.   
18ce0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
18cf0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
18d00 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
18d10 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)!=0 );.    pPa
18d20 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18d30 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  &= ~SPILLFLAG_RO
18d40 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20  LLBACK;.    if( 
18d50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73  return rc;.    s
18d70 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
18d80 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
18d90 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
18da0 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
18db0 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
18dc0 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
18dd0 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
18de0 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
18df0 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
18e00 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
18e10 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
18e20 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
18e30 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
18e40 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
18e50 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
18e60 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
18e70 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
18e80 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
18e90 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
18ea0 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
18eb0 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
18ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
18ed0 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
18ee0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
18ef0 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
18f00 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
18f10 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
18f20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
18f30 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
18f40 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
18f50 70 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20  pPg);.    /* It 
18f60 75 73 65 64 20 74 6f 20 62 65 20 74 68 61 74 20  used to be that 
18f70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18f80 65 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20  eClean(pPg) was 
18f90 63 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75  called here.  Bu
18fa0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61  t.    ** that ca
18fb0 6c 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73  ll was dangerous
18fc0 20 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65   and had no dete
18fd0 63 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73  ctable benefit s
18fe0 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a 20  ince the cache. 
18ff0 20 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c     ** is normall
19000 79 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c  y cleaned by sql
19010 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
19020 6c 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62  ll() after rollb
19030 61 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a  ack and so.    *
19040 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
19050 65 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ed. */.    pager
19060 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
19070 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
19080 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
19090 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
190a0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
190b0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
190c0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
190d0 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
190e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
190f0 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
19100 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
19110 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
19120 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
19130 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
19140 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
19150 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
19160 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
19170 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20  rom disk */.#if 
19180 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
19190 0a 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63  .    if( jrnlEnc
191a0 20 29 7b 20 43 4f 44 45 43 31 28 70 50 61 67 65   ){ CODEC1(pPage
191b0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
191c0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
191d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d  E_NOMEM_BKPT); }
191e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
191f0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
19200 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
19210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19220 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
19230 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
19240 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
19250 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
19260 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
19270 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
19280 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
19290 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
192a0 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
192b0 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
192c0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
192d0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
192e0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
192f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19300 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
19310 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
19320 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
19330 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
19340 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
19350 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
19360 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
19370 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
19380 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
19390 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
193a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
193b0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
193c0 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
193d0 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
193e0 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
193f0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
19400 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
19410 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
19420 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
19430 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
19440 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
19450 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
19460 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
19470 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
19480 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
19490 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
194a0 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
194b0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
194c0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
194d0 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
194e0 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
194f0 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
19500 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
19510 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
19520 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
19530 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
19540 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19550 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
19560 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
19570 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
19580 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
19590 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
195a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
195b0 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
195c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
195d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
195e0 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
195f0 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
19600 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
19610 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
19620 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
19630 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
19640 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
19650 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
19660 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
19670 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
19680 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
19690 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
196a0 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
196b0 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
196c0 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
196d0 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
196e0 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
196f0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
19700 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
19710 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
19720 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
19730 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
19740 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
19750 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
19760 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
19770 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
19780 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
19790 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
197a0 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
197b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
197c0 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
197d0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
197e0 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
197f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
19800 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
19810 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
19820 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
19830 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
19840 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
19850 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
19860 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
19870 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
19880 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
19890 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
198a0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
198b0 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
198c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
198d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
198e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
198f0 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
19900 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
19910 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
19920 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
19930 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
19940 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
19950 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
19960 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
19970 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
19980 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
19990 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
199a0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
199b0 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
199c0 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
199d0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
199e0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
199f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
19a00 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
19a10 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
19a30 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
19a40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
19a50 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
19a60 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
19a70 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19a80 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
19a90 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
19aa0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
19ab0 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
19ac0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
19ad0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
19ae0 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
19af0 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
19b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
19b10 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
19b20 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
19b30 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
19b40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
19b50 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
19b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
19b70 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
19b80 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
19b90 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
19ba0 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
19bb0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
19bc0 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
19bd0 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
19be0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
19bf0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
19c00 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
19c10 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
19c20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
19c30 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
19c40 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
19c50 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
19c60 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
19c70 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
19c80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19c90 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
19ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
19cb0 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
19cc0 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
19cd0 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
19ce0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
19cf0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
19d00 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
19d10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
19d20 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
19d30 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
19d40 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
19d50 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
19d60 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19d70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
19d80 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
19d90 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
19da0 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
19db0 4f 4e 0a 20 20 20 20 20 20 28 70 50 61 67 65 72  ON.      (pPager
19dc0 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
19dd0 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
19de0 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
19df0 64 69 66 0a 20 20 20 20 20 20 28 53 51 4c 49 54  dif.      (SQLIT
19e00 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
19e10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
19e20 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
19e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
19e40 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
19e50 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
19e60 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
19e70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19e80 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19e90 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
19ea0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
19eb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
19ec0 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
19ed0 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
19ee0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
19ef0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
19f00 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
19f10 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
19f20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
19f30 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
19f40 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
19f50 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
19f60 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
19f70 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
19f80 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
19f90 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
19fa0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
19fb0 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
19fc0 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
19fd0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
19fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19ff0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a000 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
1a010 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1a020 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
1a030 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
1a040 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
1a050 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
1a060 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
1a070 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
1a080 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a090 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67  OMEM_BKPT;.    g
1a0a0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a0b0 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  t;.  }.  zMaster
1a0c0 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
1a0d0 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
1a0e0 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20  rnal+1];.  rc = 
1a0f0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
1a100 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
1a110 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
1a120 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
1a130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a140 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a150 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73  ster_out;.  zMas
1a160 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
1a170 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
1a180 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d  .  zJournal = zM
1a190 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
1a1a0 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
1a1b0 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
1a1c0 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
1a1d0 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  ){.    int exist
1a1e0 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
1a1f0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a200 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
1a210 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1a220 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
1a230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a240 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1a250 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a260 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69     }.    if( exi
1a270 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sts ){.      /* 
1a280 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
1a290 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
1a2a0 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
1a2b0 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
1a2c0 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
1a2d0 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
1a2e0 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
1a2f0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
1a300 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
1a310 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
1a320 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
1a330 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
1a340 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1a350 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  c;.      int fla
1a360 67 73 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45  gs = .#if SQLITE
1a370 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
1a380 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20  TECTION.        
1a390 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
1a3a0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
1a3b0 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
1a3c0 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
1a3d0 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
1a3e0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
1a3f0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1a400 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
1a410 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
1a420 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
1a430 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
1a440 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a460 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
1a470 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
1a480 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
1a490 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1a4a0 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
1a4b0 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
1a4c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
1a4d0 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
1a4e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a4f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a500 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
1a510 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
1a520 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
1a530 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
1a540 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
1a550 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
1a560 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
1a570 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
1a580 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
1a590 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
1a5a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a5b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
1a5c0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
1a5d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a5e0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
1a5f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1a600 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
1a610 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
1a620 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
1a630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
1a640 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
1a650 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
1a660 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
1a670 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
1a680 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
1a690 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
1a6a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
1a6b0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
1a6c0 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
1a6d0 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
1a6e0 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
1a6f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a700 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
1a710 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1a720 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
1a730 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
1a740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
1a750 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
1a760 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
1a770 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
1a780 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
1a790 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
1a7a0 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
1a7b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
1a7c0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
1a7d0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
1a7e0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1a7f0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1a800 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
1a810 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
1a820 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
1a830 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
1a840 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
1a850 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1a860 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
1a870 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
1a880 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
1a890 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
1a8a0 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
1a8b0 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
1a8c0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1a8d0 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
1a8e0 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
1a8f0 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
1a900 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
1a910 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
1a920 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
1a930 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
1a940 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
1a950 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
1a960 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
1a970 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
1a980 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
1a990 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
1a9a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1a9b0 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
1a9c0 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
1a9d0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
1a9e0 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
1a9f0 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
1aa00 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
1aa10 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
1aa20 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
1aa30 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
1aa40 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
1aa50 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
1aa60 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
1aa70 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
1aa80 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
1aa90 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
1aaa0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
1aab0 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
1aac0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1aad0 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
1aae0 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
1aaf0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
1ab00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
1ab10 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
1ab20 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
1ab30 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
1ab40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1ab50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1ab60 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
1ab70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1ab80 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
1ab90 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a  ER_READER );.  .
1aba0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1abb0 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20  ger->fd) .   && 
1abc0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1abd0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1abe0 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1abf0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1ac00 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  N) .  ){.    i64
1ac10 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
1ac20 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  wSize;.    int s
1ac30 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
1ac40 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  pageSize;.    as
1ac50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1ac60 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
1ac70 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f  OCK );.    /* TO
1ac80 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
1ac90 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
1aca0 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
1acb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1acc0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1acd0 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
1ace0 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
1acf0 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29  e = szPage*(i64)
1ad00 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
1ad10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ad20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
1ad30 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
1ad40 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
1ad50 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
1ad60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
1ad70 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
1ad80 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
1ad90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
1ada0 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67  urrentSize+szPag
1adb0 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  e)<=newSize ){. 
1adc0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d         char *pTm
1add0 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  p = pPager->pTmp
1ade0 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d  Space;.        m
1adf0 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73  emset(pTmp, 0, s
1ae00 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  zPage);.        
1ae10 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
1ae20 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75  ze-szPage) == cu
1ae30 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
1ae40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1ae50 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
1ae60 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  >  currentSize )
1ae70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1ae80 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1ae90 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20  ager->fd, pTmp, 
1aea0 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d  szPage, newSize-
1aeb0 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  szPage);.      }
1aec0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1aed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aee0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
1aef0 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  leSize = nPage;.
1af00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1af10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1af20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1af30 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69   sanitized versi
1af40 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  on of the sector
1af50 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65  -size of OS file
1af60 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72   pFile. The.** r
1af70 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67  eturn value is g
1af80 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65  uaranteed to lie
1af90 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20   between 32 and 
1afa0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1afb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
1afc0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1afd0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1afe0 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c    int iRet = sql
1aff0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1b000 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69  (pFile);.  if( i
1b010 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52  Ret<32 ){.    iR
1b020 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  et = 512;.  }els
1b030 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53  e if( iRet>MAX_S
1b040 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
1b050 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
1b060 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
1b070 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58  ;.    iRet = MAX
1b080 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1b090 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b  }.  return iRet;
1b0a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1b0b0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
1b0c0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1b0d0 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
1b0e0 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
1b0f0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
1b100 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1b110 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
1b120 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
1b130 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1b140 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
1b150 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
1b160 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
1b170 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
1b180 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
1b190 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
1b1a0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1b1b0 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
1b1c0 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
1b1d0 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
1b1e0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1b1f0 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
1b200 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
1b210 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1b220 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1b230 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
1b240 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
1b250 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1b260 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
1b270 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1b280 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1b290 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
1b2a0 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a  ed up to 32 if.*
1b2b0 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  * it is less tha
1b2c0 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64  n 32, or rounded
1b2d0 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
1b2e0 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
1b2f0 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
1b300 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
1b310 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1b320 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c  file has the SQL
1b330 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1b340 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72  AFE_OVERWRITE pr
1b350 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74  operty, then set
1b360 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76  .** the effectiv
1b370 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f  e sector size to
1b380 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   its minimum val
1b390 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70  ue (512).  The p
1b3a0 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61  urpose of.** pPa
1b3b0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b3c0 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  is to define the
1b3d0 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20   "blast radius" 
1b3e0 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a  of bytes that.**
1b3f0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66   might change if
1b400 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
1b410 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
1b420 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1b430 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e  n.** that range.
1b440 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52    But with POWER
1b450 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20  SAFE_OVERWRITE, 
1b460 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73  the blast radius
1b470 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61   is zero.** (tha
1b480 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53  t is what POWERS
1b490 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65  AFE_OVERWRITE me
1b4a0 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69  ans), so we mini
1b4b0 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a  mize the sector.
1b4c0 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61  ** size.  For ba
1b4d0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
1b4e0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c  ility of the rol
1b4f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
1b500 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65  le format,.** we
1b510 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74   cannot reduce t
1b520 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1b530 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35  tor size below 5
1b540 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
1b550 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
1b560 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1b570 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1b580 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1b590 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1b5a0 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  e );..  if( pPag
1b5b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20  er->tempFile.   
1b5c0 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
1b5d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1b5e0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26  cs(pPager->fd) &
1b5f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b600 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1b610 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1b620 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
1b630 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
1b640 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
1b650 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1b660 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
1b670 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
1b680 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1b690 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
1b6a0 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
1b6b0 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
1b6c0 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
1b6d0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1b6e0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
1b6f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b700 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1b710 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f  e = sqlite3Secto
1b720 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
1b730 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b740 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
1b750 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
1b760 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
1b770 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
1b780 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1b790 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
1b7a0 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
1b7b0 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
1b7c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1b7d0 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
1b7e0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
1b7f0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
1b800 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
1b810 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
1b820 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
1b830 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1b840 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1b850 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
1b860 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
1b870 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1b880 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
1b890 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1b8a0 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
1b8b0 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
1b8c0 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
1b8d0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1b8e0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
1b8f0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1b900 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1b910 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
1b920 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
1b930 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
1b940 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
1b950 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
1b960 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1b970 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
1b980 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
1b990 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
1b9a0 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
1b9b0 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
1b9c0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b9d0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b9e0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1b9f0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
1ba00 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
1ba10 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
1ba20 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
1ba30 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1ba40 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1ba50 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
1ba60 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
1ba70 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
1ba80 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
1ba90 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
1baa0 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
1bab0 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
1bac0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
1bad0 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
1bae0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
1baf0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
1bb00 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1bb10 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
1bb20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
1bb30 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
1bb40 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
1bb50 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
1bb60 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
1bb70 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
1bb80 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
1bb90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1bba0 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1bbb0 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
1bbc0 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
1bbd0 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
1bbe0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
1bbf0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
1bc00 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
1bc10 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
1bc20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1bc30 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
1bc40 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
1bc50 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
1bc60 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
1bc70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1bc80 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
1bc90 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
1bca0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
1bcb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1bcc0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
1bcd0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
1bce0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
1bcf0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1bd00 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
1bd10 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
1bd20 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
1bd30 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
1bd40 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
1bd50 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
1bd60 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
1bd70 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
1bd80 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
1bd90 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1bda0 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
1bdb0 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
1bdc0 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
1bdd0 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
1bde0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
1bdf0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
1be00 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1be10 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
1be20 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
1be30 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1be40 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
1be50 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
1be60 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
1be70 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
1be80 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
1be90 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
1bea0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
1beb0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
1bec0 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
1bed0 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
1bee0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
1bef0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
1bf00 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
1bf10 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
1bf20 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
1bf30 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
1bf40 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
1bf50 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
1bf60 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1bf70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1bf80 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1bf90 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1bfa0 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1bfb0 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1bfc0 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1bfd0 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1bfe0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1bff0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1c000 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1c010 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1c020 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1c030 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1c040 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1c050 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1c060 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1c070 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1c080 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1c090 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1c0a0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1c0b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1c0c0 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1c0d0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1c0e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1c0f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1c100 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1c110 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1c120 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1c130 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1c140 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1c150 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1c160 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1c170 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1c180 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1c190 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1c1a0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1c1b0 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1c1c0 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1c1d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1c1e0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1c1f0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1c200 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1c210 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1c220 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1c230 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1c240 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1c250 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1c260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1c270 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1c280 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1c290 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1c2a0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1c2b0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1c2c0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1c2d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1c2e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1c2f0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1c300 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1c310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c320 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1c330 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1c340 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c360 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1c370 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1c380 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1c390 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1c3a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1c3b0 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1c3c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1c3d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1c3e0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1c3f0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1c400 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1c410 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1c420 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1c430 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1c440 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1c450 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1c460 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1c470 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1c480 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1c490 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1c4a0 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1c4b0 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1c4c0 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1c4d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62   */.  int nPlayb
1c4e0 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ack = 0;       /
1c4f0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1c500 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64  f pages restored
1c510 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
1c520 0a 20 20 75 33 32 20 73 61 76 65 64 50 61 67 65  .  u32 savedPage
1c530 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
1c540 61 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46  ageSize;..  /* F
1c550 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1c560 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
1c570 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1c580 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
1c590 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
1c5a0 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
1c5b0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1c5c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1c5d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1c5e0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1c5f0 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
1c600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c610 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1c620 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
1c630 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
1c640 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
1c650 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
1c660 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
1c670 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
1c680 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1c690 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
1c6a0 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
1c6b0 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
1c6c0 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
1c6d0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1c6e0 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
1c6f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1c700 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
1c710 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   back..  **.  **
1c720 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c   TODO: Technical
1c730 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
1c740 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
1c750 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20  ause it assumes 
1c760 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  that.  ** buffer
1c770 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
1c780 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b   is (mxPathname+
1c790 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67  1) bytes or larg
1c7a0 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20  er. i.e. that.  
1c7b0 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ** (pPager->page
1c7c0 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
1c7d0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1c7e0 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e  +1). Using os_un
1c7f0 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74  ix.c,.  ** mxPat
1c800 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1c810 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1c820 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1c830 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1c840 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1c850 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1c860 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1c870 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1c880 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1c890 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1c8a0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1c8b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1c8c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c8d0 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1c8e0 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1c8f0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1c900 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1c910 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1c920 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1c930 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1c940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c950 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1c960 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c970 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1c980 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1c990 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1c9a0 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1c9b0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1c9c0 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1c9d0 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1c9e0 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1c9f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1ca00 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1ca10 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1ca20 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1ca30 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1ca40 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1ca50 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1ca60 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1ca70 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1ca80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1ca90 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1caa0 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1cab0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1cac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1cad0 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1cae0 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1caf0 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1cb00 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1cb10 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1cb20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1cb30 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1cb40 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1cb50 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1cb60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1cb70 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1cb80 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1cb90 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1cba0 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1cbb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cbc0 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1cbd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1cbe0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1cbf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1cc10 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1cc20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1cc30 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1cc40 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1cc50 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1cc60 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1cc70 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1cc80 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1cc90 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1cca0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1ccb0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1ccc0 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1ccd0 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1cce0 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1ccf0 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1cd00 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1cd10 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1cd20 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1cd30 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1cd40 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1cd50 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1cd60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1cd70 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1cd80 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1cd90 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1cda0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1cdb0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1cdc0 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1cdd0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1cde0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1cdf0 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1ce00 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1ce10 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1ce20 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1ce30 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1ce40 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1ce50 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1ce60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1ce70 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1ce80 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1ce90 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1cea0 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1ceb0 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1cec0 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1ced0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1cee0 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1cef0 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1cf00 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1cf10 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1cf20 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1cf30 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1cf40 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1cf50 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1cf60 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1cf70 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1cf80 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1cf90 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1cfa0 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1cfb0 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1cfc0 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1cfd0 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1cfe0 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1cff0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1d000 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1d010 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1d020 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1d030 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1d040 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1d050 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1d060 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1d070 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1d080 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1d090 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1d0a0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1d0b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1d0c0 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1d0d0 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1d0e0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1d0f0 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1d100 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d110 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1d120 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1d130 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1d140 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1d150 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1d160 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1d170 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1d180 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1d190 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1d1a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1d1b0 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1d1c0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1d1d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1d1e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1d1f0 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1d200 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1d210 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1d220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1d230 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1d240 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1d250 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1d260 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1d270 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1d280 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1d290 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1d2a0 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1d2b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d2c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d2d0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1d2e0 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1d2f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1d300 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1d310 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1d320 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1d330 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1d340 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1d350 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1d360 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1d370 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1d380 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1d390 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1d3a0 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1d3b0 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1d3c0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1d3d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1d3e0 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1d3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1d400 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1d410 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1d420 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1d430 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1d440 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d460 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20    nPlayback++;. 
1d470 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d480 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d490 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1d4a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1d4b0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
1d4c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1d4d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1d4e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1d4f0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1d500 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1d510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
1d520 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c   been truncated,
1d530 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61   simply stop rea
1d540 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20  ding and.       
1d550 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1d560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68   the journal. Th
1d570 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20  is might happen 
1d580 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  if the journal w
1d590 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1d5a0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77  not completely w
1d5b0 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65  ritten and synce
1d5c0 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61  d prior to a cra
1d5d0 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20  sh.  In that.   
1d5e0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20         ** case, 
1d5f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
1d600 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62  uld have never b
1d610 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74  een written in t
1d620 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1d630 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69  first place so i
1d640 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c  t is OK to simpl
1d650 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f  y abandon the ro
1d660 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  llback. */.     
1d670 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d680 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1d690 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1d6a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1d6b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1d6c0 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
1d6d0 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74  o rollback, quit
1d6e0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
1d6f0 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1d700 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77  ** code.  This w
1d710 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61  ill cause the pa
1d720 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
1d730 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20   error state.   
1d740 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61         ** so tha
1d750 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72  t no further har
1d760 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20  m will be done. 
1d770 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
1d780 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
1d790 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
1d7a0 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c  long will be abl
1d7b0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e to rollback th
1d7c0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
1d7d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d7e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1d7f0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
1d800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d810 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
1d820 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
1d830 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
1d840 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1d860 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1d870 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
1d880 20 26 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c   &savedPageSize,
1d890 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46   -1);.  }.  /* F
1d8a0 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1d8b0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1d8c0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1d8d0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1d8e0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1d8f0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1d900 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1d910 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1d920 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1d930 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1d940 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1d950 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1d960 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1d970 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1d980 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1d990 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1d9a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1d9b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1d9c0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1d9d0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1d9e0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1d9f0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1da00 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1da10 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1da20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1da30 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1da40 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1da50 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1da60 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1da70 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1da80 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1da90 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1daa0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1dab0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1dac0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1dad0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1dae0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1daf0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1db00 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1db10 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1db20 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1db30 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1db40 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1db50 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1db60 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1db70 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1db80 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1db90 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1dba0 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1dbb0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1dbc0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1dbd0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1dbe0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1dbf0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1dc00 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1dc10 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1dc20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1dc30 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1dc40 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1dc50 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1dc60 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1dc70 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1dc80 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1dc90 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1dca0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1dcb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dcc0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1dcd0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1dce0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1dcf0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1dd00 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1dd10 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1dd20 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1dd30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1dd40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1dd50 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1dd60 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1dd70 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1dd80 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1dd90 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1dda0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1ddb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ddc0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1ddd0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1dde0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ddf0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1de00 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1de10 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1de20 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1de30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1de40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1de50 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1de60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1de70 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1de80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1de90 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1dea0 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1deb0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1dec0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1ded0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1dee0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1def0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1df00 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1df10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1df20 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1df30 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1df40 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1df50 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1df60 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1df70 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1df80 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1df90 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1dfa0 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1dfb0 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1dfc0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1dfd0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1dfe0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1dff0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1e000 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1e010 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1e020 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1e030 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1e040 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1e050 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1e060 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1e070 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1e080 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1e090 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1e0a0 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1e0b0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1e0c0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1e0d0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1e0e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e0f0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1e100 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1e110 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1e120 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6f  database file (o
1e130 72 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20  r out of.** the 
1e140 57 41 4c 20 69 66 20 74 68 61 74 20 69 73 20 77  WAL if that is w
1e150 68 65 72 65 20 74 68 65 20 6d 6f 73 74 20 72 65  here the most re
1e160 63 65 6e 74 20 63 6f 70 79 20 69 66 20 66 6f 75  cent copy if fou
1e170 6e 64 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67  nd) into .** pPg
1e180 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65  ->pData. A share
1e190 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  d lock or greate
1e1a0 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  r must be held o
1e1b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
1e1c0 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
1e1d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e1e0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
1e1f0 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20  page 1 is read, 
1e200 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
1e210 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
1e220 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a  rs[] is set to.*
1e230 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
1e240 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1e250 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1e260 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1e270 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49  curs, then the I
1e280 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  O error is retur
1e290 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1e2a0 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  r..** Otherwise,
1e2b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e2c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1e2d0 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
1e2e0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1e2f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e300 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
1e310 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
1e320 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1e330 65 20 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72  e pPg */.  int r
1e340 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1e350 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1e360 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e 64  n code */..#ifnd
1e370 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1e380 41 4c 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  AL.  u32 iFrame 
1e390 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1e3a0 20 20 2f 2a 20 46 72 61 6d 65 20 6f 66 20 57 41    /* Frame of WA
1e3b0 4c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 67 6e  L containing pgn
1e3c0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1e3d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1e3e0 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1e3f0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1e400 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1e410 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28  r->fd) );..  if(
1e420 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1e430 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
1e440 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
1e450 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1e460 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69  l, pPg->pgno, &i
1e470 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  Frame);.    if( 
1e480 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1e490 20 20 7d 0a 20 20 69 66 28 20 69 46 72 61 6d 65    }.  if( iFrame
1e4a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1e4b0 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65  ite3WalReadFrame
1e4c0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69  (pPager->pWal, i
1e4d0 46 72 61 6d 65 2c 70 50 61 67 65 72 2d 3e 70 61  Frame,pPager->pa
1e4e0 67 65 53 69 7a 65 2c 70 50 67 2d 3e 70 44 61 74  geSize,pPg->pDat
1e4f0 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  a);.  }else.#end
1e500 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69  if.  {.    i64 i
1e510 4f 66 66 73 65 74 20 3d 20 28 70 50 67 2d 3e 70  Offset = (pPg->p
1e520 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1e530 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1e540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e550 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
1e560 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61   pPg->pData, pPa
1e570 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
1e580 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
1e590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1e5a0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1e5b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e5c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1e5d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
1e5e0 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1e5f0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1e600 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1e610 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1e620 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1e630 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1e640 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1e650 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1e660 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1e670 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1e680 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1e690 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1e6a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1e6b0 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1e6c0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1e6d0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1e6e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1e6f0 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1e700 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1e710 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1e720 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1e730 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1e740 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1e750 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1e760 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1e770 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1e780 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1e790 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1e7a0 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1e7b0 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1e7c0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1e7d0 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1e7e0 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1e7f0 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1e800 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1e810 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1e820 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1e830 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1e840 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1e850 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31  noise equaling 1
1e860 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
1e870 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
1e880 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
1e890 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
1e8a0 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
1e8b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
1e8c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e8d0 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
1e8e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e8f0 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
1e900 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
1e910 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
1e920 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
1e930 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1e940 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1e950 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1e960 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1e970 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
1e980 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1e990 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
1e9a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
1e9b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1e9c0 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52  _BKPT);..  PAGER
1e9d0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1e9e0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1e9f0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1ea00 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1ea10 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1ea20 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1ea30 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
1ea40 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
1ea50 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1ea60 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1ea80 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1ea90 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  Pg->pgno, pager_
1eaa0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
1eab0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1eac0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
1ead0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1eae0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1eaf0 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64  t offsets 24 and
1eb00 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65   92 in.** the he
1eb10 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c  ader and the sql
1eb20 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1eb30 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e  er at offset 96.
1eb40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
1eb50 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  n unconditional 
1eb60 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73  update.  See als
1eb70 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72  o the pager_incr
1eb80 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
1eb90 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63  .** routine whic
1eba0 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74  h only updates t
1ebb0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1ebc0 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20  r if the update 
1ebd0 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e  is actually.** n
1ebe0 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d  eeded, as determ
1ebf0 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67  ined by the pPag
1ec00 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1ec10 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62  one state variab
1ec20 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1ec30 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63  id pager_write_c
1ec40 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48  hangecounter(PgH
1ec50 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20  dr *pPg){.  u32 
1ec60 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1ec70 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1ec80 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1ec90 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1eca0 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1ecb0 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
1ecc0 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
1ecd0 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67  et4byte((u8*)pPg
1ece0 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ->pPager->dbFile
1ecf0 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32  Vers)+1;.  put32
1ed00 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1ed10 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
1ed20 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
1ed30 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74   /* Also store t
1ed40 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  he SQLite versio
1ed50 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65  n number in byte
1ed60 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a  s 96..99 and in.
1ed70 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
1ed80 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
1ed90 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
1eda0 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
1edb0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20   number.  ** is 
1edc0 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33  valid. */.  put3
1edd0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1ede0 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68  g->pData)+92, ch
1edf0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1ee00 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1ee10 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39  r*)pPg->pData)+9
1ee20 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  6, SQLITE_VERSIO
1ee30 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69  N_NUMBER);.}..#i
1ee40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ee50 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_WAL./*.** This
1ee60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
1ee70 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  oked once for ea
1ee80 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ch page that has
1ee90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a   already been .*
1eea0 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  * written into t
1eeb0 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e  he log file when
1eec0 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1eed0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1eee0 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  k..** Parameter 
1eef0 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20  iPg is the page 
1ef00 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70  number of said p
1ef10 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72  age. The pCtx ar
1ef20 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63  gument .** is ac
1ef30 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
1ef40 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
1ef50 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
1ef60 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72  f page iPg is pr
1ef70 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63  esent in the cac
1ef80 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f  he, and has no o
1ef90 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1efa0 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ences,.** it is 
1efb0 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72  discarded. Other
1efc0 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61  wise, if there a
1efd0 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
1efe0 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65  utstanding.** re
1eff0 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61  ferences, the pa
1f000 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65  ge content is re
1f010 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
1f020 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
1f030 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72  .** attempt to r
1f040 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72  eload content fr
1f050 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1f060 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20  is required and 
1f070 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72  fails, .** retur
1f080 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
1f090 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
1f0a0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
1f0b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f0c0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f  rUndoCallback(vo
1f0d0 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69  id *pCtx, Pgno i
1f0e0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1f0f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1f100 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
1f110 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67  ger *)pCtx;.  Pg
1f120 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
1f130 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1f140 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
1f150 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
1f160 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69  Lookup(pPager, i
1f170 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg);.  if( pPg )
1f180 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1f190 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
1f1a0 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20  unt(pPg)==1 ){. 
1f1b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
1f1c0 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20  heDrop(pPg);.   
1f1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f1e0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
1f1f0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1f200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f210 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
1f220 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
1f230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f240 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
1f250 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20  tNull(pPg);.    
1f260 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  }.  }..  /* Norm
1f270 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73  ally, if a trans
1f280 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1f290 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75   back, any backu
1f2a0 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a  p processes are.
1f2b0 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20    ** updated as 
1f2c0 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f  data is copied o
1f2d0 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ut of the rollba
1f2e0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ck journal and i
1f2f0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
1f300 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e  abase. This is n
1f310 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73  ot generally pos
1f320 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c  sible with a WAL
1f330 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20   database, as.  
1f340 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f  ** rollback invo
1f350 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e  lves simply trun
1f360 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  cating the log f
1f370 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  ile. Therefore, 
1f380 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d  if one.  ** or m
1f390 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20  ore frames have 
1f3a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1f3b0 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tten to the log 
1f3c0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a  (and therefore .
1f3d0 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64    ** also copied
1f3e0 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70   into the backup
1f3f0 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70   databases) as p
1f400 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  art of this tran
1f410 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68  saction,.  ** th
1f420 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62  e backups must b
1f430 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a  e restarted..  *
1f440 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  /.  sqlite3Backu
1f450 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
1f460 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65  >pBackup);..  re
1f470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f480 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f490 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
1f4a0 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1f4b0 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74  ion on a WAL dat
1f4c0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1f4d0 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61   int pagerRollba
1f4e0 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  ckWal(Pager *pPa
1f4f0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f520 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64  n Code */.  PgHd
1f530 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  r *pList;       
1f540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1f550 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1f560 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a  es to revert */.
1f570 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61  .  /* For all pa
1f580 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1f590 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
1f5a0 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76  tly dirty or hav
1f5b0 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  e already.  ** b
1f5c0 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74  een written (but
1f5d0 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20   not committed) 
1f5e0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c  to the log file,
1f5f0 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a   do one of the .
1f600 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a    ** following:.
1f610 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69    **.  **   + Di
1f620 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64  scard the cached
1f630 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75   page (if refcou
1f640 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  nt==0), or.  ** 
1f650 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20    + Reload page 
1f660 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1f670 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65   database (if re
1f680 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a  fcount>0)..  */.
1f690 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1f6a0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
1f6b0 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  gSize;.  rc = sq
1f6c0 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61  lite3WalUndo(pPa
1f6d0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72  ger->pWal, pager
1f6e0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  UndoCallback, (v
1f6f0 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20  oid *)pPager);. 
1f700 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1f710 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1f720 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1f730 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
1f740 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1f750 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
1f760 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pNext = pList->p
1f770 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20  Dirty;.    rc = 
1f780 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1f790 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  k((void *)pPager
1f7a0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1f7b0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
1f7c0 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
1f7d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1f7e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1f7f0 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
1f800 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1f810 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c  (). As well as l
1f820 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ogging.** the co
1f830 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69  ntents of the li
1f840 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64  st of pages head
1f850 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e  ed by pList (con
1f860 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
1f870 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1f880 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79  ion notifies any
1f890 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70   active backup p
1f8a0 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68  rocesses that th
1f8b0 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20  e pages have.** 
1f8c0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  changed. .**.** 
1f8d0 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  The list of page
1f8e0 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  s passed into th
1f8f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
1f900 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70  ways sorted by p
1f910 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48  age number..** H
1f920 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20  ence, if page 1 
1f930 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65  appears anywhere
1f940 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74   on the list, it
1f950 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72   will be the fir
1f960 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61  st page..*/ .sta
1f970 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c  tic int pagerWal
1f980 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20  Frames(.  Pager 
1f990 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
1f9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1f9b0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
1f9c0 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20  gHdr *pList,    
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f9e0 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73  * List of frames
1f9f0 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e   to log */.  Pgn
1fa00 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  o nTruncate,    
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66  Database size af
1fa30 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20  ter this commit 
1fa40 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1fa50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1fa60 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1fa70 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74  this is a commit
1fa80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1fab0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1fac0 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20   nList;         
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fae0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1faf0 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67  in pList */.  Pg
1fb00 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb20 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1fb30 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73  r pages */..  as
1fb40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
1fb50 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1fb60 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20  pList );.#ifdef 
1fb70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1fb80 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1fb90 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69  e page list is i
1fba0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
1fbb0 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69  r */.  for(p=pLi
1fbc0 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72  st; p && p->pDir
1fbd0 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  ty; p=p->pDirty)
1fbe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1fbf0 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74  >pgno < p->pDirt
1fc00 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23  y->pgno );.  }.#
1fc10 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1fc20 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d   pList->pDirty==
1fc30 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b  0 || isCommit );
1fc40 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20  .  if( isCommit 
1fc50 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57  ){.    /* If a W
1fc60 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1fc70 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
1fc80 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  d, there is no p
1fc90 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a  oint in writing.
1fca0 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73      ** any pages
1fcb0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
1fcc0 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  rs greater than 
1fcd0 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74  nTruncate into t
1fce0 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20  he WAL file..   
1fcf0 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65   ** They will ne
1fd00 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61  ver be read by a
1fd10 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65  ny client. So re
1fd20 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
1fd30 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a  he pDirty.    **
1fd40 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20   list here. */. 
1fd50 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78     PgHdr **ppNex
1fd60 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20  t = &pList;.    
1fd70 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66  nList = 0;.    f
1fd80 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70  or(p=pList; (*pp
1fd90 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d  Next = p)!=0; p=
1fda0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1fdb0 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e    if( p->pgno<=n
1fdc0 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1fdd0 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d      ppNext = &p-
1fde0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20  >pDirty;.       
1fdf0 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20   nList++;.      
1fe00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1fe10 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d  rt( pList );.  }
1fe20 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20  else{.    nList 
1fe30 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 1;.  }.  pPage
1fe40 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
1fe50 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c  TAT_WRITE] += nL
1fe60 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73  ist;..  if( pLis
1fe70 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
1fe80 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1fe90 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20  ounter(pList);. 
1fea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1feb0 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70  Frames(pPager->p
1fec0 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67  Wal, .      pPag
1fed0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c  er->pageSize, pL
1fee0 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20  ist, nTruncate, 
1fef0 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72  isCommit, pPager
1ff00 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20  ->walSyncFlags. 
1ff10 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1ff20 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
1ff30 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
1ff40 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1ff50 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ff60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
1ff70 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
1ff80 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67  ->pBackup, p->pg
1ff90 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61  no, (u8 *)p->pDa
1ffa0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1ffb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1ffc0 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73  ECK_PAGES.  pLis
1ffd0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1ffe0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1fff0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66  r->pPCache);.  f
20000 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
20010 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
20020 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
20030 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  ash(p);.  }.#end
20040 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
20050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
20060 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
20070 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a  on on the WAL..*
20080 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20090 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c  e used to be cal
200a0 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e  led "pagerOpenSn
200b0 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73  apshot()" becaus
200c0 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79  e it essentially
200d0 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70  .** makes a snap
200e0 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61  shot of the data
200f0 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72  base at the curr
20100 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  ent point in tim
20110 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a  e and preserves.
20120 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  ** that snapshot
20130 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
20140 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20  reader in spite 
20150 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20  of concurrently 
20160 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74  changes by.** ot
20170 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63  her writers or c
20180 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  heckpointers..*/
20190 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
201a0 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
201b0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
201c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
201f0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
20200 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20  changed = 0;    
20210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20220 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73  rue if cache mus
20230 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20  t be reset */.. 
20240 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
20250 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
20260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20270 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
20280 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
20290 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
202a0 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71  ADER );..  /* sq
202b0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
202c0 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73  ransaction() was
202d0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20   not called for 
202e0 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a  the previous.  *
202f0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  * transaction in
20300 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
20310 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c  CLUSIVE.  So cal
20320 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65  l it now.  If we
20330 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63  .  ** are in loc
20340 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c  king_mode=NORMAL
20350 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77   and EndRead() w
20360 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  as previously ca
20370 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64  lled,.  ** the d
20380 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73  uplicate call is
20390 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
203a0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
203b0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
203c0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
203d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
203e0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
203f0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
20400 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20  l, &changed);.  
20410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20420 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a  K || changed ){.
20430 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
20440 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20450 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
20460 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ) ) sqlite3OsUnf
20470 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
20480 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
20490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
204a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
204b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
204c0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
204d0 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
204e0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74   PAGER_OPEN.** t
204f0 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
20500 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  tate to determin
20510 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
20520 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
20530 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73  ** in pages (ass
20540 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  uming the page s
20550 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ize currently st
20560 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61  ored in Pager.pa
20570 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  geSize)..**.** I
20580 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
20590 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
205a0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
205b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
205c0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65  abase.** in page
205d0 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  s is stored in *
205e0 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73  pnPage. Otherwis
205f0 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
20600 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c   (perhaps.** SQL
20610 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
20620 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20630 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
20640 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
20650 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20660 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
20670 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70  *pPager, Pgno *p
20680 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
20690 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
206a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
206b0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
206c0 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
206d0 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20  * Query the WAL 
206e0 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  sub-system for t
206f0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20700 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28  . The WalDbsize(
20710 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ).  ** function 
20720 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  returns zero if 
20730 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f  the WAL is not o
20740 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e  pen (i.e. Pager.
20750 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  pWal==0), or.  *
20760 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
20770 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76  e size is not av
20780 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74  ailable. The dat
20790 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
207a0 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  t.  ** available
207b0 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
207c0 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20  b-system if the 
207d0 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74  log file is empt
207e0 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  y or.  ** contai
207f0 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d  ns no valid comm
20800 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
20810 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ns..  */.  asser
20820 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20830 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
20840 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20850 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
20860 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20870 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
20880 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
20890 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
208a0 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67  ile==0 );.  nPag
208b0 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
208c0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
208d0 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
208e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
208f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
20900 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
20910 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  e from the.  ** 
20920 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20  WAL sub-system, 
20930 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61  determine the pa
20940 67 65 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f  ge count based o
20950 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20  n the size of.  
20960 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
20970 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69  file.  If the si
20980 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20990 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  se file is not a
209a0 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d  n.  ** integer m
209b0 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70  ultiple of the p
209c0 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20  age-size, round 
209d0 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  up the result.. 
209e0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   */.  if( nPage=
209f0 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f  =0 && ALWAYS(isO
20a00 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29  pen(pPager->fd))
20a10 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
20a20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20a30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20a40 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
20a50 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  s */.    int rc 
20a60 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
20a70 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
20a80 26 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  &n);.    if( rc!
20a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20aa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20ab0 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d     }.    nPage =
20ac0 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65   (Pgno)((n+pPage
20ad0 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f  r->pageSize-1) /
20ae0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
20af0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
20b00 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
20b10 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
20b20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
20b30 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a  ter than the.  *
20b40 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78  * configured max
20b50 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65  imum pager numbe
20b60 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  r, increase the 
20b70 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f  allowed limit so
20b80 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66  .  ** that the f
20b90 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e  ile can be read.
20ba0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
20bb0 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  e>pPager->mxPgno
20bc0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
20bd0 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
20be0 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e  Page;.  }..  *pn
20bf0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
20c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20c10 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
20c20 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
20c30 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  ** Check if the 
20c40 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20  *-wal file that 
20c50 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
20c60 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
20c70 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20  ed by pPager.** 
20c80 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61  exists if the da
20c90 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
20ca0 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68  py, or verify th
20cb0 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  at the *-wal fil
20cc0 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  e does.** not ex
20cd0 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67  ist (by deleting
20ce0 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61   it) if the data
20cf0 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70  base file is emp
20d00 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
20d10 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
20d20 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a   empty and the *
20d30 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
20d40 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72  , open the pager
20d50 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  .** in WAL mode.
20d60 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
20d70 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66  e is empty or if
20d80 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65   no *-wal file e
20d90 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20  xists and.** if 
20da0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
20db0 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72   make sure Pager
20dc0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20  .journalMode is 
20dd0 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41  not set to.** PA
20de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20df0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  WAL..**.** Retur
20e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61  n SQLITE_OK or a
20e10 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  n error code..**
20e20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
20e30 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45  ust hold a SHARE
20e40 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
20e50 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
20e60 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  all this.** func
20e70 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e  tion. Because an
20e80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
20e90 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69  on the db file i
20ea0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65  s required to de
20eb0 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f  lete .** a WAL o
20ec0 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64  n a none-empty d
20ed0 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e  atabase, this en
20ee0 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e  sures there is n
20ef0 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  o race condition
20f00 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65   .** between the
20f10 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77   xAccess() below
20f20 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28   and an xDelete(
20f30 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64  ) being executed
20f40 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68   by some .** oth
20f50 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  er connection..*
20f60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
20f70 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
20f80 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
20f90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20fa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
20fb0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20fc0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
20fd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20fe0 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
20ff0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  _LOCK );..  if( 
21000 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
21010 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57  e ){.    int isW
21020 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
21030 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21040 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74  f WAL file exist
21050 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  s */.    rc = sq
21060 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
21070 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
21080 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
21090 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
210a0 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a  _EXISTS, &isWal.
210b0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
210c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
210d0 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
210e0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
210f0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
21100 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
21110 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21120 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
21130 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
21140 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
21150 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
21160 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
21170 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  c;.        if( n
21180 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
21190 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
211a0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
211b0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
211c0 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
211d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
211e0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
211f0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
21200 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
21210 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  che)==0 );.     
21220 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21230 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
21240 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
21250 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
21260 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
21270 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
21280 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
21290 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
212a0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
212b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
212c0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
212d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
212e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
212f0 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
21300 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
21310 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
21320 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
21330 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
21340 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
21350 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
21360 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
21370 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
21380 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
21390 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
213a0 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
213b0 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
213c0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
213d0 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
213e0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
213f0 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
21400 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
21410 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
21420 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
21430 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
21440 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
21450 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
21460 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
21470 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
21480 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
21490 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
214a0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
214b0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
214c0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
214d0 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
214e0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
214f0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
21500 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
21510 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
21520 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
21530 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
21540 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
21550 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
21560 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
21570 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
21580 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
21590 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
215a0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
215b0 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
215c0 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
215d0 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
215e0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
215f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
21600 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
21610 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
21620 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
21630 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
21640 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
21650 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
21660 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
21670 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
21680 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
21690 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
216a0 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
216b0 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
216c0 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
216d0 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
216e0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
216f0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
21700 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
21710 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
21720 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
21730 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
21740 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
21750 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
21760 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
21770 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
21780 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
21790 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
217a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
217b0 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
217c0 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
217d0 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
217e0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
217f0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
21800 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
21810 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
21820 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
21830 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
21840 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
21850 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
21860 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
21870 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
21880 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
21890 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
218a0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
218b0 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
218c0 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
218d0 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
218e0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
218f0 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
21900 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
21910 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
21920 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
21930 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
21940 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
21950 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
21960 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
21970 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
21980 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
21990 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
219a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
219b0 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
219c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
219d0 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
219e0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
219f0 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
21a00 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
21a10 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a30 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
21a40 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
21a50 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
21a60 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
21a70 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
21a80 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
21a90 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
21aa0 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
21ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
21ac0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
21ad0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
21ae0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
21af0 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
21b00 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
21b10 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
21b20 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21b30 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
21b40 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
21b50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21b60 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
21b70 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
21b80 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
21b90 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
21ba0 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
21bb0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
21bc0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
21bd0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
21be0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
21bf0 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
21c00 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
21c10 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
21c20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21c30 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
21c40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
21c50 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
21c60 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
21c70 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
21c80 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
21c90 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
21ca0 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
21cb0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
21cc0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
21cd0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
21ce0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
21cf0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
21d00 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
21d10 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
21d20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
21d30 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
21d40 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
21d50 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21d60 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
21d70 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
21d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
21d90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21da0 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
21db0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
21dc0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
21dd0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
21de0 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
21df0 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
21e00 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
21e10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21e20 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
21e30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
21e40 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
21e50 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
21e60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21e70 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
21e80 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
21e90 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
21ea0 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
21eb0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21ec0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
21ed0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
21ee0 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
21ef0 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
21f00 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21f10 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
21f20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21f30 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
21f40 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
21f50 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
21f60 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
21f70 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
21f80 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
21f90 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
21fa0 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
21fb0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
21fc0 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
21fd0 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
21fe0 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
21ff0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
22000 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
22010 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
22020 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
22030 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
22040 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
22050 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
22060 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
22070 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
22080 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
22090 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
220a0 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
220b0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
220c0 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
220d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
220e0 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
220f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
22100 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
22110 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22120 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
22130 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
22140 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
22150 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
22160 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
22170 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
22180 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
22190 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
221a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
221b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
221c0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
221d0 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
221e0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
221f0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
22200 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
22210 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
22220 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
22230 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
22240 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
22250 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
22260 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
22270 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
22280 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
22290 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
222a0 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
222b0 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
222c0 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
222d0 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
222e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
222f0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
22300 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
22310 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
22320 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22330 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
22340 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
22350 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
22360 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
22370 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
22380 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
22390 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
223a0 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
223b0 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
223c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
223d0 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
223e0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
223f0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
22400 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
22410 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
22420 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
22430 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
22440 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
22450 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
22460 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
22470 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
22480 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
22490 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
224a0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
224b0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
224c0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
224d0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
224e0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
224f0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
22500 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
22510 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
22520 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
22530 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
22540 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
22550 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
22560 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
22570 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
22580 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
22590 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
225a0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
225b0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
225c0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
225d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
225e0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
225f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22600 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
22610 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
22620 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22630 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
22640 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
22650 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
22660 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
22670 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
22680 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
22690 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
226a0 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
226b0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
226c0 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
226d0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
226e0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
226f0 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
22700 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
22710 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
22720 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
22730 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
22740 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
22750 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22760 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
22770 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69   = (i64)pSavepoi
22780 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
22790 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
227a0 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
227b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
227c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
227d0 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
227e0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
227f0 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
22800 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
22810 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
22820 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
22830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22840 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
22850 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
22860 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
22870 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61  ==(i64)ii*(4+pPa
22880 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
22890 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
228a0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
228b0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
228c0 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
228d0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
228e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
228f0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
22900 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
22910 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
22920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22930 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22940 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
22950 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
22960 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
22970 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
22980 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
22990 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
229a0 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
229b0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
229c0 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e  to recycle clean
229d0 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65   and unused page
229e0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
229f0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
22a00 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
22a10 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
22a20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
22a30 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
22a40 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
22a50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  age);.}../*.** C
22a60 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22a70 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
22a80 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
22a90 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
22aa0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
22ab0 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73  g to spill pages
22ac0 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a   to journal..*/.
22ad0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22ae0 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67  SetSpillsize(Pag
22af0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
22b00 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  mxPage){.  retur
22b10 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  n sqlite3PcacheS
22b20 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67  etSpillsize(pPag
22b30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
22b40 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
22b50 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
22b60 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
22b70 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
22b80 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
22b90 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
22ba0 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
22bb0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22bc0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
22bd0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
22be0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
22bf0 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
22c00 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
22c10 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
22c20 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
22c30 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
22c40 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
22c50 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
22c60 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
22c70 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
22c80 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68     setGetterMeth
22c90 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  od(pPager);.    
22ca0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
22cb0 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
22cc0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
22cd0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
22ce0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
22cf0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
22d00 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
22d10 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70  f any memory map
22d20 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65  ping made of the
22d30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
22d40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
22d50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
22d60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22d70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
22d80 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d  Mmap){.  pPager-
22d90 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  >szMmap = szMmap
22da0 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c  ;.  pagerFixMapl
22db0 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  imit(pPager);.}.
22dc0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
22dd0 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
22de0 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
22df0 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
22e00 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
22e10 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
22e20 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
22e30 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
22e40 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
22e50 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e  ** Adjust settin
22e60 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  gs of the pager 
22e70 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
22e80 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67  ed in the pgFlag
22e90 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  s parameter..**.
22ea0 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69  ** The "level" i
22eb0 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  n pgFlags & PAGE
22ec0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
22ed0 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75  SK sets the robu
22ee0 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65  stness.** of the
22ef0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
22f00 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
22f10 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66  ashes or power f
22f20 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68  ailures by.** ch
22f30 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
22f40 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
22f50 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  en writing the j
22f60 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72  ournals..** Ther
22f70 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c  e are four level
22f80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
22f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
22fa0 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
22fb0 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
22fc0 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
22fe0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
22ff0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
23000 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
23010 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
23020 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
23030 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
23040 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
23050 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
23060 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
23070 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
23080 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
230a0 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
230b0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
230c0 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
230d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
230e0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
230f0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
23100 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
23110 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
23120 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
23130 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
23140 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
23150 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
23170 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
23180 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
23190 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
231a0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
231b0 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
231c0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
231d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
231e0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
231f0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
23200 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
23210 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
23220 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
23230 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
23240 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
23250 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
23260 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
23270 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
23280 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
23290 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
232a0 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
232b0 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
232c0 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
232d0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
232e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
232f0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
23300 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
23310 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
23320 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
23330 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
23340 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
23350 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
23360 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
23370 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20  .**.**    EXTRA 
23380 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
23390 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61   FULL except tha
233a0 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20  t is also syncs 
233b0 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
233d0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
233e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
233f0 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62   after the rollb
23400 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ack.**          
23410 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75      journal is u
23420 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nlinked..**.** T
23430 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
23440 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
23450 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
23460 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
23470 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
23480 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
23490 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
234a0 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
234b0 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
234c0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
234d0 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
234e0 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
234f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
23500 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
23510 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
23520 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
23530 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
23540 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
23550 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
23560 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
23570 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
23580 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
23590 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
235a0 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
235b0 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
235c0 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
235d0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
235e0 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
235f0 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
23600 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
23610 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
23620 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
23630 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23640 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20   NORMAL.  There 
23650 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
23660 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a   between FULL.**
23670 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57   and EXTRA for W
23680 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44  AL mode..**.** D
23690 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
236a0 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
236b0 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
236c0 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
236d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
236e0 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
236f0 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
23700 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
23710 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
23720 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
23730 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
23740 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
23750 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
23760 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
23770 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
23780 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
23790 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
237a0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
237b0 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
237c0 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
237d0 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
237e0 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
237f0 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
23800 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
23810 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
23820 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
23830 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
23840 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
23850 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
23860 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
23870 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
23880 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
23890 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
238a0 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
238b0 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
238c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
238d0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
238e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
238f0 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61  erSetFlags(.  Pa
23900 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23910 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
23920 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
23930 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e  evel for */.  un
23940 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
23950 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
23960 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  lags */.){.  uns
23970 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67  igned level = pg
23980 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
23990 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a  NCHRONOUS_MASK;.
239a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
239b0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
239c0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31  ager->noSync = 1
239d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
239e0 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  llSync = 0;.    
239f0 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
23a00 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
23a10 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
23a20 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47  nc =  level==PAG
23a30 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f  ER_SYNCHRONOUS_O
23a40 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61  FF ?1:0;.    pPa
23a50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
23a60 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e  level>=PAGER_SYN
23a70 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31  CHRONOUS_FULL ?1
23a80 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  :0;.    pPager->
23a90 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65  extraSync = leve
23aa0 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
23ab0 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b  NOUS_EXTRA ?1:0;
23ac0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
23ad0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
23ae0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
23af0 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
23b00 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
23b10 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b  GER_FULLFSYNC ){
23b20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
23b30 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23b40 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
23b50 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
23b60 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
23b70 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
23b80 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61    }.  pPager->wa
23b90 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 28 70 50  lSyncFlags = (pP
23ba0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3c  ager->syncFlags<
23bb0 3c 32 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  <2);.  if( pPage
23bc0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
23bd0 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
23be0 6e 63 46 6c 61 67 73 20 7c 3d 20 70 50 61 67 65  ncFlags |= pPage
23bf0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
23c00 7d 0a 20 20 69 66 28 20 28 70 67 46 6c 61 67 73  }.  if( (pgFlags
23c10 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55   & PAGER_CKPT_FU
23c20 4c 4c 46 53 59 4e 43 29 20 26 26 20 21 70 50 61  LLFSYNC) && !pPa
23c30 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
23c40 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
23c50 6e 63 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  ncFlags |= (SQLI
23c60 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32 29  TE_SYNC_FULL<<2)
23c70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c  ;.  }.  if( pgFl
23c80 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48  ags & PAGER_CACH
23c90 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50  ESPILL ){.    pP
23ca0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
23cb0 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f   &= ~SPILLFLAG_O
23cc0 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FF;.  }else{.   
23cd0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
23ce0 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
23cf0 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  _OFF;.  }.}.#end
23d00 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
23d10 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
23d20 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
23d30 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
23d40 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
23d50 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
23d60 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
23d70 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
23d80 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
23d90 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
23da0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
23db0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23dc0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
23dd0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
23de0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
23df0 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
23e00 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
23e10 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
23e20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
23e30 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
23e40 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23e50 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
23e60 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
23e70 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
23e80 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
23e90 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
23ea0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
23eb0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
23ec0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
23ed0 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
23ee0 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
23ef0 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
23f00 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
23f10 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
23f20 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
23f30 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
23f40 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
23f50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23f60 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
23f70 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
23f80 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23f90 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
23fa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23fb0 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
23fc0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
23fd0 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
23fe0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
23ff0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
24000 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
24010 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
24020 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
24030 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
24040 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
24050 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
24060 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
24070 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
24080 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
240a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
240b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
240c0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
240d0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
240e0 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
240f0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
24100 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
24110 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
24120 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
24130 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
24140 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ON.            (
24150 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
24160 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c  &SQLITE_OPEN_FIL
24170 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b  EPROTECTION_MASK
24180 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  )|.#endif.      
24190 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
241a0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
241b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
241c0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
241d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
241e0 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
241f0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
24200 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24210 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
24220 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
24230 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
24240 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
24250 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
24260 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
24270 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
24280 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
24290 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
242a0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
242b0 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
242c0 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
242d0 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
242e0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
242f0 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
24300 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
24310 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
24320 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
24330 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
24340 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
24350 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
24360 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
24370 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
24380 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
24390 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
243a0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
243b0 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
243c0 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
243d0 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
243e0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
243f0 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
24400 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
24410 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
24420 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
24430 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
24460 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
24470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
244a0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
244b0 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
244c0 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
244d0 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
244e0 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
244f0 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
24500 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
24510 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
24520 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
24530 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
24540 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
24550 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
24560 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
24570 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
24580 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
24590 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
245a0 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
245b0 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
245c0 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
245d0 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
245e0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
245f0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
24600 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
24610 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24620 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
24630 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
24640 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
24650 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
24660 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
24670 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
24680 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
24690 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
246a0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
246b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
246c0 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
246d0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
246e0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
246f0 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
24700 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  dler */.){.  pPa
24710 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
24720 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
24730 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
24740 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
24750 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a  usyHandlerArg;..
24760 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24770 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24780 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69  void **ap = (voi
24790 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42  d **)&pPager->xB
247a0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
247b0 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29  assert( ((int(*)
247c0 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29  (void *))(ap[0])
247d0 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20  )==xBusyHandler 
247e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
247f0 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c  p[1]==pBusyHandl
24800 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c  erArg );.    sql
24810 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
24820 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
24830 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42  , SQLITE_FCNTL_B
24840 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69  USYHANDLER, (voi
24850 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  d *)ap);.  }.}..
24860 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
24870 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
24880 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
24890 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
248a0 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
248b0 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
248c0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
248d0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
248e0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
248f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24900 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
24910 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
24920 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
24930 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
24940 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
24950 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
24960 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20  QLITE_IOERR, an 
24970 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78  SQLITE_IOERR_xxx
24980 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c   sub-code or SQL
24990 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
249a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
249b0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
249c0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
249d0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
249e0 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
249f0 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
24a00 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
24a10 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
24a20 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
24a30 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
24a40 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
24a50 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
24a60 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
24a70 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
24a80 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
24a90 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
24aa0 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
24ab0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
24ac0 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
24ad0 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
24ae0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
24af0 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
24b00 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
24b10 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
24b20 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
24b30 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
24b40 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
24b50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24b60 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
24b70 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
24b80 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
24b90 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
24ba0 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
24bb0 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
24bc0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
24bd0 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
24be0 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
24bf0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
24c00 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
24c10 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
24c20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
24c30 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
24c40 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
24c50 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24c60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
24c70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
24c80 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
24c90 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
24ca0 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
24cb0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
24cc0 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
24cd0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
24ce0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
24cf0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
24d00 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
24d10 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
24d20 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
24d30 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
24d40 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
24d50 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
24d60 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
24d70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
24d80 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
24d90 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
24da0 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
24db0 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50  *pPager, u32 *pP
24dc0 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
24dd0 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
24de0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
24df0 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
24e00 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66  ssible to do a f
24e10 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72  ull assert_pager
24e20 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61  _state() here, a
24e30 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
24e40 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
24e50 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50  ed from within P
24e60 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f  agerOpen(), befo
24e70 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  re the state.  *
24e80 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  * of the Pager o
24e90 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61  bject is interna
24ea0 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
24eb0 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65    **.  ** At one
24ec0 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63   point this func
24ed0 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e  tion returned an
24ee0 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61   error if the pa
24ef0 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a  ger was in .  **
24f00 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
24f10 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41  te. But since PA
24f20 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20  GER_ERROR state 
24f30 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
24f40 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74    ** there is at
24f50 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
24f60 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
24f70 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63  rence, this func
24f80 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e  tion.  ** is a n
24f90 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61  o-op for that ca
24fa0 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a  se anyhow..  */.
24fb0 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20  .  u32 pageSize 
24fc0 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
24fd0 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
24fe0 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
24ff0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
25000 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
25010 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66  GE_SIZE) );.  if
25020 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
25030 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
25040 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20  bSize==0).   && 
25050 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
25060 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
25070 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26  Cache)==0 .   &&
25080 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
25090 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67  eSize!=(u32)pPag
250a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
250b0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
250c0 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  w = NULL;       
250d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d        /* New tem
250e0 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  p space */.    i
250f0 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20  64 nByte = 0;.. 
25100 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
25110 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
25120 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
25130 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
25140 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
25150 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
25160 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
25170 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
25180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25190 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29   pNew = (char *)
251a0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
251b0 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
251c0 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
251d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
251e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
251f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
25210 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
25220 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
25230 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
25240 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
25250 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
25260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
25290 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
252a0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
252b0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
252c0 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
252d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
252e0 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b  = (Pgno)((nByte+
252f0 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65  pageSize-1)/page
25300 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
25310 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
25320 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65  pageSize;.    }e
25330 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
25340 65 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29  e3PageFree(pNew)
25350 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
25360 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
25370 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
25380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25390 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
253a0 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
253b0 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
253c0 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
253d0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
253e0 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
253f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
25400 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
25410 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
25420 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
25430 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46  ger);.    pagerF
25440 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
25450 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
25460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
25470 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
25480 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
25490 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
254a0 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
254b0 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
254c0 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
254d0 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
254e0 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
254f0 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
25500 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
25510 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
25520 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
25530 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
25540 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
25550 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
25560 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
25570 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
25580 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
25590 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
255a0 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
255b0 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
255c0 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
255d0 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
255e0 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
255f0 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
25600 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
25610 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
25620 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
25630 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
25640 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
25650 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
25660 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
25670 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
25680 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
25690 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
256a0 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
256b0 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
256c0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
256d0 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
256e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
256f0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
25700 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
25710 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
25720 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
25730 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
25740 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
25750 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
25760 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
25770 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
25780 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
25790 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
257a0 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ge;.  }.  assert
257b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
257c0 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20  !=PAGER_OPEN ); 
257d0 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f       /* Called o
257e0 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63  nly by OP_MaxPgc
257f0 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nt */.  assert( 
25800 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d  pPager->mxPgno>=
25810 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
25820 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e  ;  /* OP_MaxPgcn
25830 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20  t enforces this 
25840 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  */.  return pPag
25850 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
25860 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
25870 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
25880 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
25890 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
258a0 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
258b0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
258c0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
258d0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
258e0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
258f0 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
25900 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
25910 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
25920 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
25930 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
25940 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
25950 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
25960 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
25970 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
25980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
25990 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
259a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
259b0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
259c0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
259d0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
259e0 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
259f0 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
25a00 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
25a10 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
25a20 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
25a30 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
25a40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
25a50 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
25a60 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
25a70 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
25a80 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
25a90 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25aa0 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
25ab0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
25ac0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
25ad0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
25ae0 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
25af0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25b00 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
25b10 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
25b20 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
25b30 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
25b40 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
25b50 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
25b60 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
25b70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
25b80 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
25b90 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
25ba0 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
25bb0 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
25bc0 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
25bd0 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
25be0 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
25bf0 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
25c00 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
25c10 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
25c20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
25c30 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
25c40 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
25c50 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
25c60 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
25c70 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
25c80 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
25c90 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
25ca0 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
25cb0 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
25cc0 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
25cd0 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
25ce0 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
25cf0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
25d00 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
25d10 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
25d20 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
25d30 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
25d40 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
25d50 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
25d60 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
25d70 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
25d80 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
25d90 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
25da0 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
25db0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
25dc0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
25dd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
25de0 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
25df0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
25e00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
25e10 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
25e20 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
25e30 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
25e40 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
25e50 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
25e60 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
25e70 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
25e80 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
25e90 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
25ea0 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
25eb0 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
25ec0 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
25ed0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
25ee0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
25ef0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
25f00 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
25f10 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
25f20 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
25f30 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
25f40 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
25f50 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
25f60 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
25f70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
25f80 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
25f90 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25fa0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
25fb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25fc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25fd0 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
25fe0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
25ff0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
26000 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  is open on.** th
26010 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75  e pager. It retu
26020 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
26030 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
26040 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
26050 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
26060 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
26070 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
26080 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
26090 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
260a0 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
260b0 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
260c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
260d0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
260e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
260f0 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
26100 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
26110 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
26120 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
26130 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
26140 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
26150 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
26160 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
26170 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  ->dbSize;.}.../*
26180 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
26190 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
261a0 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
261b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
261c0 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
261d0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
261e0 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
261f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26200 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
26210 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
26220 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
26230 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
26240 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
26250 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
26260 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
26270 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
26280 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
26290 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
262a0 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
262b0 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
262c0 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
262d0 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
262e0 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
262f0 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
26300 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
26310 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
26320 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
26330 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
26340 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
26350 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
26360 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
26370 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
26380 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
26390 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
263a0 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
263b0 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
263c0 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
263d0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
263e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
263f0 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
26400 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
26410 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
26420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26440 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26450 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
26460 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
26470 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
26480 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
26490 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
264a0 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20  ready held), or 
264b0 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73  one of the trans
264c0 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  itions that the 
264d0 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
264e0 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
264f0 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
26500 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
26510 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
26520 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
26530 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
26540 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
26550 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79  r->eLock>=lockty
26560 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
26570 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
26580 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
26590 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  e==SHARED_LOCK).
265a0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
265b0 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  r->eLock==RESERV
265c0 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  ED_LOCK && lockt
265d0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
265e0 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20  OCK).  );..  do 
265f0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
26600 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c  LockDb(pPager, l
26610 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  ocktype);.  }whi
26620 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
26630 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
26640 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
26650 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
26660 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Arg) );.  return
26670 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
26680 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
26690 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
266a0 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
266b0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
266c0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
266d0 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
266e0 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
266f0 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
26700 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
26710 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
26720 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
26730 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
26740 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
26750 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
26760 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
26770 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
26780 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
26790 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
267a0 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
267b0 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
267c0 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
267d0 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
267e0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
267f0 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
26800 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
26810 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
26820 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
26830 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
26840 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
26850 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
26860 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
26870 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
26880 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
26890 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
268a0 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
268b0 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
268c0 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
268d0 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
268e0 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
268f0 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
26900 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
26910 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
26920 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
26930 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
26940 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
26950 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
26960 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
26970 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
26980 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  vior would be to
26990 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
269a0 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
269b0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
269c0 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
269d0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
269e0 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
269f0 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
26a00 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
26a10 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
26a20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
26a30 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
26a40 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
26a50 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
26a60 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
26a70 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
26a80 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
26a90 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
26aa0 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
26ab0 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
26ac0 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
26ad0 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
26ae0 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
26af0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
26b00 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
26b10 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26b20 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
26b30 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
26b40 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
26b50 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
26b60 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
26b70 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
26b80 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
26b90 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
26ba0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
26bb0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26bc0 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
26bd0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
26be0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
26bf0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
26c00 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
26c10 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
26c20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
26c30 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26c40 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
26c50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
26c60 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
26c70 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
26c80 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
26c90 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
26ca0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
26cb0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
26cc0 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
26cd0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
26ce0 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
26cf0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
26d00 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
26d10 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
26d20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
26d30 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
26d40 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
26d50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
26d60 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
26d70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26d80 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69  s only called ri
26d90 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
26da0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
26db0 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ion..** Once thi
26dc0 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  s function has b
26dd0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
26de0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
26df0 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f   either be.** ro
26e00 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d  lled back or com
26e10 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f  mitted. It is no
26e20 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74  t safe to call t
26e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
26e40 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  .** then continu
26e50 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
26e60 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
26e70 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
26e80 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
26e90 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
26ea0 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
26eb0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
26ec0 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
26ed0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
26ee0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
26ef0 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
26f00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
26f10 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41  = nPage;..  /* A
26f20 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
26f30 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64  code here called
26f40 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26f50 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20  onstraint() to. 
26f60 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
26f70 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20  all pages being 
26f80 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62  truncated away b
26f90 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
26fa0 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e   are,.  ** if on
26fb0 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
26fc0 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70  ints are open, p
26fd0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61  resent in the sa
26fe0 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f  vepoint .  ** jo
26ff0 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68  urnal so that th
27000 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
27010 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f  ed if the savepo
27020 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20  int is rolled.  
27030 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ** back. This is
27040 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73   no longer neces
27050 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e  sary as this fun
27060 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c  ction is now onl
27070 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69  y.  ** called ri
27080 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
27090 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
270a0 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68  ion. So although
270b0 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
270c0 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c   object may stil
270d0 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65  l have open save
270e0 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53  points (Pager.nS
270f0 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20  avepoint!=0), . 
27100 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   ** they cannot 
27110 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
27120 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75  So the assertTru
27130 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
27140 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e  ) call.  ** is n
27150 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74  o longer correct
27160 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  . */.}.../*.** T
27170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27180 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
27190 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
271a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
271b0 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
271c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
271d0 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
271e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
271f0 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
27200 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
27210 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
27220 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
27230 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
27240 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
27250 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
27260 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
27270 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
27280 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
27290 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
272a0 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
272b0 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
272c0 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
272d0 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
272e0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
272f0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
27300 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
27310 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
27320 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
27330 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
27340 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
27350 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
27360 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
27370 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
27380 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
27390 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
273a0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
273b0 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
273c0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
273d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
273e0 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
273f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
27400 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27410 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
27420 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
27430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
27440 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
27450 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
27460 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
27470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27480 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27490 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
274a0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
274b0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
274c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
274d0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
274e0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
274f0 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66  .** Obtain a ref
27500 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f  erence to a memo
27510 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f  ry mapped page o
27520 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e  bject for page n
27530 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20  umber pgno. .** 
27540 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
27550 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e  ill use the poin
27560 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69  ter pData, obtai
27570 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28  ned from xFetch(
27580 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  )..** If success
27590 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65  ful, set *ppPage
275a0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
275b0 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65   new page refere
275c0 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  nce.** and retur
275d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
275e0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
275f0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
27600 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a  ode and set.** *
27610 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  ppPage to zero..
27620 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72  **.** Page refer
27630 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62  ences obtained b
27640 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  y calling this f
27650 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
27660 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79  e released.** by
27670 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65   calling pagerRe
27680 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a  leaseMapPage()..
27690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
276a0 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
276b0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
276c0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
276d0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
276e0 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ject */.  Pgno p
276f0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
27700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
27710 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f  e number */.  vo
27720 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  id *pData,      
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27740 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61   xFetch()'d data
27750 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
27760 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61  /.  PgHdr **ppPa
27770 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ge              
27780 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75      /* OUT: Acqu
27790 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  ired page object
277a0 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
277b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
277c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
277d0 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74  ry mapped page t
277e0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20  o return */.  . 
277f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d   if( pPager->pMm
27800 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20  apFreelist ){.  
27810 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20    *ppPage = p = 
27820 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27830 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65  elist;.    pPage
27840 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27850 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
27860 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
27870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27880 67 65 72 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29  ger->nExtra>=8 )
27890 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
278a0 70 45 78 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20  pExtra, 0, 8);. 
278b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
278c0 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72  age = p = (PgHdr
278d0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
278e0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64  Zero(sizeof(PgHd
278f0 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  r) + pPager->nEx
27900 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  tra);.    if( p=
27910 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27920 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
27930 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
27940 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
27950 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
27960 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
27970 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
27980 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  T;.    }.    p->
27990 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a  pExtra = (void *
279a0 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66  )&p[1];.    p->f
279b0 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41  lags = PGHDR_MMA
279c0 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  P;.    p->nRef =
279d0 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65   1;.    p->pPage
279e0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a  r = pPager;.  }.
279f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
27a00 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70  xtra==(void *)&p
27a10 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [1] );.  assert(
27a20 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a   p->pPage==0 );.
27a30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
27a40 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29  gs==PGHDR_MMAP )
27a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
27a60 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
27a70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
27a80 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70  ef==1 );..  p->p
27a90 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d  gno = pgno;.  p-
27aa0 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  >pData = pData;.
27ab0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
27ac0 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ut++;..  return 
27ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
27ae0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
27af0 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  se a reference t
27b00 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20  o page pPg. pPg 
27b10 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  must have been r
27b20 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a  eturned by an .*
27b30 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  * earlier call t
27b40 6f 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  o pagerAcquireMa
27b50 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
27b60 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c  ic void pagerRel
27b70 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64  easeMapPage(PgHd
27b80 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
27b90 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
27ba0 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72  pPager;.  pPager
27bb0 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20  ->nMmapOut--;.  
27bc0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
27bd0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27be0 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ist;.  pPager->p
27bf0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70  MmapFreelist = p
27c00 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
27c10 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
27c20 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
27c30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55   );.  sqlite3OsU
27c40 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
27c50 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67  d, (i64)(pPg->pg
27c60 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61  no-1)*pPager->pa
27c70 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61  geSize, pPg->pDa
27c80 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ta);.}../*.** Fr
27c90 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a  ee all PgHdr obj
27ca0 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ects stored in t
27cb0 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72  he Pager.pMmapFr
27cc0 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a  eelist list..*/.
27cd0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
27ce0 72 46 72 65 65 4d 61 70 48 64 72 73 28 50 61 67  rFreeMapHdrs(Pag
27cf0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
27d00 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72  gHdr *p;.  PgHdr
27d10 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
27d20 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72  =pPager->pMmapFr
27d30 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65  eelist; p; p=pNe
27d40 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
27d50 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
27d60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
27d70 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  .  }.}.../*.** S
27d80 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
27d90 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
27da0 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
27db0 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
27dc0 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
27dd0 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
27de0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
27df0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
27e00 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
27e10 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
27e20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
27e30 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
27e40 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
27e50 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
27e60 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
27e70 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
27e80 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
27e90 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
27ea0 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
27eb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
27ec0 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
27ed0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
27ee0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
27ef0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
27f00 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
27f10 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
27f20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
27f30 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
27f40 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
27f50 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
27f60 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
27f70 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
27f80 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
27f90 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
27fa0 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
27fb0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
27fc0 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
27fd0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
27fe0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
27ff0 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74  r *pPager, sqlit
28000 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20 2a 70  e3 *db){.  u8 *p
28010 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
28020 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
28030 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20    assert( db || 
28040 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
28050 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
28060 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
28070 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
28080 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
28090 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
280a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
280b0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
280c0 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
280d0 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
280e0 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
280f0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
28100 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
28110 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
28120 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
28130 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70   assert( db || p
28140 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29  Pager->pWal==0 )
28150 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  ;.  sqlite3WalCl
28160 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
28170 2c 20 64 62 2c 20 70 50 61 67 65 72 2d 3e 77 61  , db, pPager->wa
28180 6c 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67  lSyncFlags, pPag
28190 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
281a0 20 20 20 20 28 64 62 20 26 26 20 28 64 62 2d 3e      (db && (db->
281b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e  flags & SQLITE_N
281c0 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 3f 20  oCkptOnClose) ? 
281d0 30 20 3a 20 70 54 6d 70 29 0a 20 20 29 3b 0a 20  0 : pTmp).  );. 
281e0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
281f0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65  0;.#endif.  page
28200 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
28210 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
28220 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
28230 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
28240 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
28250 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
28260 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
28270 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
28280 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
28290 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
282a0 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
282b0 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
282c0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
282d0 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
282e0 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
282f0 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
28300 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
28310 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
28320 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
28330 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
28340 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
28350 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
28360 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
28370 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
28380 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
28390 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
283a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
283b0 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
283c0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
283d0 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
283e0 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
283f0 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
28400 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
28410 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
28420 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28430 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
28440 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
28450 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
28460 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
28470 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
28480 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
28490 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
284a0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
284b0 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
284c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
284d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
284e0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
284f0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
28500 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
28510 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
28520 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
28530 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
28540 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
28550 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
28560 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
28570 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
28580 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
28590 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
285a0 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
285b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
285c0 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
285d0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
285e0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
285f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
28600 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
28610 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
28620 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
28630 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
28640 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
28650 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
28660 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
28670 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
28680 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
28690 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
286a0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
286b0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
286c0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
286d0 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
286e0 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
286f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
28700 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
28710 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28720 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
28730 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
28740 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
28750 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
28760 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
28770 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
28780 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
28790 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
287a0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
287b0 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
287c0 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
287d0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
287e0 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
287f0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
28800 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
28810 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
28820 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
28830 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
28840 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28850 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
28860 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
28870 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
28880 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
28890 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
288a0 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
288b0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
288c0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
288d0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
288e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
288f0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
28900 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
28910 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
28920 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
28930 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
28940 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
28950 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
28960 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
28970 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
28980 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
28990 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
289a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
289b0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
289c0 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
289d0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
289e0 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
289f0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
28a00 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
28a10 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
28a20 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
28a30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
28a40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
28a50 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
28a60 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
28a70 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
28a80 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
28a90 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
28aa0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
28ab0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
28ac0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
28ad0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
28ae0 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
28af0 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
28b00 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
28b10 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
28b20 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
28b30 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
28b40 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
28b50 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
28b60 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
28b70 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
28b80 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
28b90 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
28ba0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
28bb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28bc0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
28bd0 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
28be0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
28bf0 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
28c00 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
28c10 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
28c20 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
28c30 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
28c40 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
28c50 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
28c60 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
28c70 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
28c80 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
28c90 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
28ca0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
28cb0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
28cc0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
28cd0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
28ce0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
28cf0 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
28d00 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
28d10 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
28d20 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
28d30 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
28d40 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
28d50 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
28d60 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
28d70 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
28d80 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
28d90 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
28da0 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
28db0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
28dc0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
28dd0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
28de0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
28df0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
28e00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
28e10 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
28e20 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
28e30 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
28e40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
28e50 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
28e60 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28e80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
28e90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28ea0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
28eb0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
28ec0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
28ed0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
28ee0 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
28ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
28f00 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
28f10 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
28f20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
28f30 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
28f40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28f50 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
28f60 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
28f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28f80 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
28f90 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
28fa0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
28fb0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
28fc0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
28fd0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
28fe0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
28ff0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
29000 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
29010 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
29020 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
29030 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
29040 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
29050 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
29060 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
29070 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
29080 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
29090 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
290a0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
290b0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
290c0 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
290d0 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
290e0 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
290f0 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
29100 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
29110 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
29120 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
29130 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
29140 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
29150 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
29160 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
29170 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
29180 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
29190 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
291a0 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
291b0 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
291c0 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
291d0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
291e0 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
291f0 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
29200 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
29210 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
29220 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
29230 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
29240 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
29250 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
29260 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
29270 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
29280 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
29290 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
292a0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
292b0 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
292c0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
292d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
292e0 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
292f0 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
29300 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
29310 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
29320 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
29330 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
29340 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
29350 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
29360 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
29370 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
29380 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
29390 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
293a0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
293b0 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
293c0 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
293d0 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
293e0 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
293f0 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
29400 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
29410 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
29420 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29430 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
29440 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
29450 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
29460 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
29470 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
29480 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
29490 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
294a0 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
294b0 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
294c0 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
294d0 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
294e0 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
294f0 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
29500 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
29510 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
29520 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
29530 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
29540 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
29550 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
29560 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
29570 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
29580 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
29590 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
295a0 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
295b0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
295c0 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
295d0 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
295e0 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
295f0 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
29600 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
29610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29620 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
29630 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
29640 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
29650 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
29660 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
29670 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
29680 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
29690 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
296a0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
296b0 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
296c0 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
296d0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
296e0 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
296f0 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
29700 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
29710 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
29720 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
29730 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29740 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
29750 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
29760 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
29770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
29790 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
297a0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
297b0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
297c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
297d0 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
297e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
297f0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
29800 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
29810 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
29820 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
29830 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
29840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
29850 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
29860 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
29870 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
29880 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
29890 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
298a0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
298b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
298c0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
298d0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
298e0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
298f0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
29900 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
29910 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
29920 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
29930 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
29940 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
29950 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
29960 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
29970 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
29980 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
29990 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
299a0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
299b0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
299c0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
299d0 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
299e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
299f0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
29a00 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
29a10 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
29a20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
29a30 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
29a40 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
29a50 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
29a60 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
29a70 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
29a80 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
29a90 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
29aa0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
29ab0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
29ac0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
29ad0 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
29ae0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
29af0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
29b00 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
29b10 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
29b20 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
29b30 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
29b40 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29b50 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
29b60 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29b70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
29b80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
29b90 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
29ba0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
29bb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
29bc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
29bd0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
29be0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29bf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29c00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
29c20 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
29c30 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
29c40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
29c50 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
29c60 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
29c70 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
29c80 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
29c90 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
29ca0 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
29cb0 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20  urnalHdr.       
29cc0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
29cd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29ce0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29cf0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
29d00 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
29d10 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
29d20 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
29d30 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
29d40 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
29d50 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
29d60 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
29d70 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
29d80 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
29d90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
29da0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
29db0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
29dc0 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
29dd0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
29de0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
29df0 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
29e00 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
29e10 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
29e20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29e30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29e40 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
29e50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
29e60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29e70 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Off;.      if( n
29e80 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63  ewHdr && 0==(iDc
29e90 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
29ea0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
29eb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
29ec0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
29ed0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
29ee0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
29ef0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29f00 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29f10 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
29f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
29f30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
29f40 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
29f50 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
29f60 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
29f70 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
29f80 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
29f90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
29fa0 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
29fb0 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
29fc0 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
29fd0 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
29fe0 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
29ff0 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
2a000 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
2a010 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
2a020 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
2a030 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
2a040 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
2a050 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
2a060 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2a070 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2a080 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2a090 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2a0a0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
2a0b0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
2a0c0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
2a0d0 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
2a0e0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
2a0f0 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
2a100 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
2a110 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
2a120 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
2a130 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
2a140 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
2a150 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2a160 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
2a170 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
2a180 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
2a190 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
2a1a0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
2a1b0 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
2a1c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
2a1d0 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
2a1e0 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
2a1f0 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
2a200 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
2a210 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
2a220 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
2a230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a240 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
2a250 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
2a260 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2a270 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
2a280 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
2a290 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
2a2a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2a2b0 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
2a2c0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
2a2d0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
2a2e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2a2f0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
2a300 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
2a310 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
2a320 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
2a330 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
2a340 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
2a350 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
2a360 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
2a370 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
2a380 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
2a390 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
2a3a0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
2a3b0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
2a3c0 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
2a3d0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
2a3e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a3f0 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
2a400 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
2a410 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
2a420 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
2a430 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2a440 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
2a450 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
2a460 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
2a470 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
2a480 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
2a490 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2a4a0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2a4b0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2a4c0 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
2a4d0 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
2a4e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2a4f0 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
2a500 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
2a510 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
2a520 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
2a530 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
2a540 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
2a550 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
2a560 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
2a570 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
2a580 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
2a590 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
2a5a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2a5b0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
2a5c0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2a5d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2a5e0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2a5f0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
2a600 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
2a610 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2a620 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
2a630 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
2a640 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
2a650 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
2a660 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2a670 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2a680 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
2a690 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
2a6a0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
2a6b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a6c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2a6d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a6e0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
2a6f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
2a700 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c  y called for rol
2a710 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20  lback pagers in 
2a720 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2a730 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
2a740 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
2a750 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
2a760 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
2a770 69 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ile || pPager->e
2a780 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2a790 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61  TER_DBMOD );.  a
2a7a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2a7b0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
2a7c0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2a7d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2a7e0 3e 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  >fd) || pList->p
2a7f0 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Dirty==0 );..  /
2a800 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
2a810 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
2a820 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2a830 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
2a840 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
2a850 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
2a860 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
2a870 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
2a880 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
2a890 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
2a8a0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
2a8b0 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
2a8c0 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
2a8d0 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
2a8e0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
2a8f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a900 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
2a910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2a920 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
2a930 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
2a940 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2a950 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
2a960 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
2a970 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
2a980 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
2a990 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
2a9a0 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
2a9b0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
2a9c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
2a9d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
2a9e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2a9f0 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ) );.  if( rc==S
2aa00 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
2aa10 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2aa20 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
2aa30 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e  e.   && (pList->
2aa40 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d  pDirty || pList-
2aa50 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
2aa60 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20  HintSize).  ){. 
2aa70 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2aa80 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72   szFile = pPager
2aa90 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
2aaa0 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67  lite3_int64)pPag
2aab0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2aac0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2aad0 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
2aae0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
2aaf0 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a  L_SIZE_HINT, &sz
2ab00 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65  File);.    pPage
2ab10 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
2ab20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2ab30 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
2ab40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2ab50 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
2ab60 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
2ab70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
2ab80 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
2ab90 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
2aba0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
2abb0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
2abc0 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
2abd0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
2abe0 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
2abf0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
2ac00 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
2ac10 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
2ac20 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
2ac30 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
2ac40 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
2ac50 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
2ac60 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
2ac70 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
2ac80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
2ac90 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
2aca0 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
2acb0 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
2acc0 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
2acd0 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
2ace0 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
2acf0 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
2ad00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
2ad10 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
2ad20 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
2ad30 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
2ad40 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
2ad50 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
2ad60 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
2ad70 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
2ad80 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
2ad90 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
2ada0 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2add0 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
2ade0 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74    ..      assert
2adf0 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ( (pList->flags&
2ae00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2ae10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2ae20 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
2ae30 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
2ae40 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
2ae50 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  t);..      /* En
2ae60 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
2ae70 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
2ae80 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
2ae90 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
2aea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2aeb0 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61  OMEM_BKPT, pData
2aec0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
2aed0 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
2aee0 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
2aef0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2af00 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
2af10 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
2af20 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
2af30 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
2af40 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
2af50 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
2af60 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
2af70 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
2af80 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
2af90 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
2afa0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
2afb0 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
2afc0 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
2afd0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
2afe0 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
2aff0 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
2b000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b010 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
2b020 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2b030 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2b040 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
2b050 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
2b060 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
2b070 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
2b080 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
2b090 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
2b0a0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2b0b0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
2b0c0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2b0d0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
2b0e0 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20  AT_WRITE]++;..  
2b0f0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
2b100 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  y backup objects
2b110 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
2b120 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
2b130 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ger. */.      sq
2b140 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
2b150 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
2b160 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c  p, pgno, (u8*)pL
2b170 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20  ist->pData);..  
2b180 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b190 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
2b1a0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
2b1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b1c0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2b1d0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
2b1e0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
2b1f0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
2b200 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
2b210 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
2b220 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
2b230 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
2b240 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
2b250 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b260 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b270 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
2b280 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2b290 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
2b2a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
2b2b0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c  _set_pagehash(pL
2b2c0 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
2b2d0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
2b2e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2b2f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
2b300 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
2b310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2b320 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
2b330 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
2b340 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
2b350 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2b360 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2b370 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
2b380 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
2b390 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
2b3a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
2b3b0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
2b3c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2b3d0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2b3e0 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
2b3f0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2b400 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
2b410 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2b420 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b430 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
2b440 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2b450 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  d) ){.    const 
2b460 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c  int flags =  SQL
2b470 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2b480 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL | SQLITE_OPE
2b490 4e 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20 20  N_READWRITE .   
2b4a0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
2b4b0 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
2b4c0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
2b4d0 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f  .      | SQLITE_
2b4e0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2b4f0 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d  SE;.    int nStm
2b500 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33  tSpill = sqlite3
2b510 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c  Config.nStmtSpil
2b520 6c 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  l;.    if( pPage
2b530 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2b540 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b550 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
2b560 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2b570 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53   ){.      nStmtS
2b580 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  pill = -1;.    }
2b590 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b5a0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  3JournalOpen(pPa
2b5b0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50  ger->pVfs, 0, pP
2b5c0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67  ager->sjfd, flag
2b5d0 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a  s, nStmtSpill);.
2b5e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b5f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
2b600 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
2b610 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
2b620 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
2b630 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
2b640 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2b650 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
2b660 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2b670 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
2b680 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
2b690 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
2b6a0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
2b6b0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
2b6c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2b6d0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
2b6e0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2b6f0 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
2b700 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
2b710 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2b720 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
2b730 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
2b740 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
2b750 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
2b760 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
2b770 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
2b780 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
2b790 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
2b7a0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
2b7b0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2b7c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b7d0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
2b7e0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2b7f0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
2b800 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2b810 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b820 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
2b830 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
2b840 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
2b850 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
2b860 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
2b870 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2b880 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2b890 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2b8a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
2b8b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b8c0 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
2b8d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2b8e0 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
2b8f0 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
2b900 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
2b910 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2b920 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
2b930 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67  geInJournal(pPag
2b940 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20  er, pPg) .      
2b950 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
2b960 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2b970 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
2b980 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2b990 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
2b9a0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
2b9b0 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
2b9c0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
2b9d0 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
2b9e0 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
2b9f0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
2ba00 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
2ba10 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
2ba20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ba30 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
2ba40 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2ba50 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
2ba60 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  et = (i64)pPager
2ba70 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
2ba80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2ba90 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2baa0 61 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  a2;..#if SQLITE_
2bab0 48 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20  HAS_CODEC   .   
2bac0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2bad0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2bae0 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
2baf0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
2bb00 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
2bb10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2bb20 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20  BKPT, pData2);. 
2bb30 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2bb40 66 0a 20 20 20 20 20 20 70 44 61 74 61 32 20 3d  f.      pData2 =
2bb50 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41   pData;.      PA
2bb60 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
2bb70 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
2bb80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2bb90 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2bba0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
2bbb0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2bbc0 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
2bbd0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2bbe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bbf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2bc00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2bc10 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
2bc20 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2bc30 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2bc40 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
2bc50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2bc60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bc70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
2bc80 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
2bc90 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2bca0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
2bcb0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
2bcc0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2bcd0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2bce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2bcf0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  }.static int sub
2bd00 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71  journalPageIfReq
2bd10 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67  uired(PgHdr *pPg
2bd20 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71  ){.  if( subjReq
2bd30 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2bd40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62  {.    return sub
2bd50 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2bd60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2bd70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bd80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2bd90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2bda0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2bdb0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2bdc0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2bdd0 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2bde0 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2bdf0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2be00 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2be10 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2be20 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2be30 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2be40 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2be50 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2be60 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2be70 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2be80 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2be90 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2bea0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2beb0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2bec0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2bed0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2bee0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2bef0 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2bf00 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2bf10 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2bf20 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2bf30 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2bf40 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2bf50 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2bf60 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2bf70 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2bf80 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2bf90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2bfa0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2bfb0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2bfc0 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2bfd0 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2bfe0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2bff0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2c000 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2c010 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2c020 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2c030 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2c040 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2c050 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2c060 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2c070 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2c080 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2c090 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2c0a0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2c0b0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2c0c0 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2c0d0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2c0e0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2c0f0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2c100 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2c110 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2c120 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2c130 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2c140 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2c150 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2c160 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2c170 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2c180 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c190 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2c1a0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2c1b0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2c1c0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2c1d0 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2c1e0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2c1f0 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2c200 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2c210 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2c220 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2c230 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2c240 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2c250 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2c260 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2c270 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2c280 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2c290 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2c2a0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2c2b0 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2c2c0 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2c2d0 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2c2e0 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2c2f0 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2c300 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2c310 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2c320 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2c330 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2c340 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2c350 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2c360 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2c370 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2c380 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2c390 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2c3a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2c3b0 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2c3c0 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2c3d0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2c3e0 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2c3f0 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2c400 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2c410 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2c420 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2c430 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2c440 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2c450 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2c460 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2c470 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2c480 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2c490 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2c4a0 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2c4b0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2c4c0 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2c4d0 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2c4e0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2c4f0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2c500 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2c510 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2c520 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2c530 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2c540 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2c550 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2c560 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2c570 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2c580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2c590 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2c5a0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2c5b0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2c5c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2c5d0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2c5e0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2c5f0 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2c600 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2c610 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2c620 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2c630 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2c640 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2c650 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2c660 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2c670 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2c680 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2c690 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2c6a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2c6b0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2c6c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c6d0 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
2c6e0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
2c6f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2c700 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
2c710 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
2c720 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
2c730 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
2c740 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2c750 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70  PageIfRequired(p
2c760 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63  Pg); .    if( rc
2c770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c780 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2c790 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2c7a0 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
2c7b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2c7c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2c7d0 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
2c7e0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28  IC_WRITE.    if(
2c7f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2c800 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2c810 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
2c820 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  lCreate(pPager->
2c830 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
2c840 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c850 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2c860 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2c870 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
2c880 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2c890 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2c8a0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
2c8b0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
2c8c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2c8d0 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
2c8e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2c8f0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
2c900 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
2c910 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2c920 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ger, 1);.    }. 
2c930 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
2c940 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2c950 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
2c960 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c970 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
2c980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c990 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
2c9a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2c9b0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2c9c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2c9d0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
2c9e0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
2c9f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
2ca00 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
2ca10 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
2ca20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ca30 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2ca40 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
2ca50 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2ca60 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2ca70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
2ca80 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
2ca90 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
2caa0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2cab0 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
2cac0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20  /*.** Flush all 
2cad0 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72  unreferenced dir
2cae0 74 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b  ty pages to disk
2caf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cb00 50 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72  PagerFlush(Pager
2cb10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2cb20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
2cb30 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45  rCode;.  if( !ME
2cb40 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
2cb50 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
2cb60 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
2cb70 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2cb80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
2cb90 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2cba0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
2cbb0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2cbc0 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
2cbd0 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
2cbe0 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
2cbf0 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20  irty;.      if( 
2cc00 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29  pList->nRef==0 )
2cc10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2cc20 61 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64  agerStress((void
2cc30 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29  *)pPager, pList)
2cc40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cc50 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
2cc60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2cc70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2cc80 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2cc90 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
2cca0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
2ccb0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
2ccc0 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
2ccd0 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
2cce0 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
2ccf0 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
2cd00 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
2cd10 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
2cd20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
2cd30 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
2cd40 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
2cd50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2cd60 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
2cd70 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
2cd80 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
2cd90 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
2cda0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
2cdb0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
2cdc0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
2cdd0 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
2cde0 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
2cdf0 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
2ce00 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
2ce10 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
2ce20 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
2ce30 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
2ce40 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2ce50 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
2ce60 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
2ce70 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
2ce80 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
2ce90 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
2cea0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2ceb0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
2cec0 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
2ced0 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
2cee0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2cef0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
2cf00 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
2cf10 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
2cf20 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
2cf30 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
2cf40 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
2cf50 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
2cf60 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
2cf70 2e 20 20 57 68 65 6e 20 61 20 6e 65 77 20 70 61  .  When a new pa
2cf80 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ge is allocated,
2cf90 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 38 20   the.** first 8 
2cfa0 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 73 70  bytes of this sp
2cfb0 61 63 65 20 61 72 65 20 7a 65 72 6f 65 64 20 62  ace are zeroed b
2cfc0 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  ut the remainder
2cfd0 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
2cfe0 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74 72 61  d..** (The extra
2cff0 20 73 70 61 63 65 20 69 73 20 75 73 65 64 20 62   space is used b
2d000 79 20 62 74 72 65 65 20 61 73 20 74 68 65 20 4d  y btree as the M
2d010 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e 29 0a  emPage object.).
2d020 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
2d030 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
2d040 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
2d050 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
2d060 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
2d070 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
2d080 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
2d090 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
2d0a0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
2d0b0 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a  * of the PAGER_*
2d0c0 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
2d0d0 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
2d0e0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
2d0f0 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
2d100 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2d110 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
2d120 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
2d130 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
2d140 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
2d150 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
2d160 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
2d170 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2d180 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2d190 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
2d1a0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
2d1b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2d1c0 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
2d1d0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
2d1e0 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
2d1f0 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
2d200 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
2d210 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
2d220 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
2d230 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
2d240 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2d250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d260 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
2d270 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
2d280 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
2d290 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
2d2a0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
2d2b0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
2d2c0 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
2d2d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2d2e0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2d2f0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
2d300 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
2d310 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
2d320 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
2d330 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
2d340 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
2d350 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2d360 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2d370 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2d380 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
2d390 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d3a0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2d3b0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
2d3c0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2d3d0 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
2d3e0 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2d3f0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
2d400 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2d410 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
2d420 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
2d430 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
2d440 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
2d450 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
2d460 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
2d470 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
2d480 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2d490 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
2d4a0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
2d4b0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
2d4c0 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
2d4d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2d4e0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
2d4f0 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
2d500 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
2d510 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
2d520 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2d530 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2d540 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
2d550 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2d560 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
2d570 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
2d580 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
2d590 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
2d5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d5b0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2d5c0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
2d5d0 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
2d5e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2d5f0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2d600 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
2d610 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
2d620 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
2d630 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2d640 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
2d650 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
2d660 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
2d670 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
2d680 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
2d690 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
2d6a0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2d6b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2d6c0 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
2d6d0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
2d6e0 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
2d6f0 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
2d700 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
2d710 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
2d720 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  l */.  int pcach
2d730 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
2d740 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
2d750 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2d760 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
2d770 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61  he */.  u32 szPa
2d780 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2d790 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2d7a0 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
2d7b0 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f  age size */.  co
2d7c0 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d  nst char *zUri =
2d7d0 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72   0;    /* URI ar
2d7e0 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  gs to copy */.  
2d7f0 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20  int nUri = 0;   
2d800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d810 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55  er of bytes of U
2d820 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69  RI args at *zUri
2d830 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
2d840 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
2d850 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
2d860 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2d870 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
2d880 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
2d890 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
2d8a0 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
2d8b0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
2d8c0 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69    */.  journalFi
2d8d0 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
2d8e0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2d8f0 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a  ze(pVfs));..  /*
2d900 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
2d910 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
2d920 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
2d930 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
2d940 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69  ppPager = 0;..#i
2d950 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d960 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28  T_MEMORYDB.  if(
2d970 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d   flags & PAGER_M
2d980 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d  EMORY ){.    mem
2d990 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  Db = 1;.    if( 
2d9a0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2d9b0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2d9c0 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2d9d0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
2d9e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2d9f0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2da00 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53  e==0  ) return S
2da10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2da20 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d  ;.      nPathnam
2da30 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2da40 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2da50 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20        zFilename 
2da60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
2da70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
2da80 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
2da90 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
2daa0 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
2dab0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
2dac0 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
2dad0 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
2dae0 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
2daf0 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
2db00 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
2db10 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
2db20 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
2db30 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
2db40 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2db50 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2db60 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2db70 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61   *z;.    nPathna
2db80 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
2db90 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
2dba0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2dbb0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
2dbc0 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
2dbd0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2dbe0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2dbf0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2dc00 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  KPT;.    }.    z
2dc10 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
2dc20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
2dc30 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
2dc40 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
2dc50 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63   fails */.    rc
2dc60 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
2dc70 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2dc80 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
2dc90 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
2dca0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2dcb0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2dcc0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2dcd0 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69   z = zUri = &zFi
2dce0 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  lename[sqlite3St
2dcf0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
2dd00 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
2dd10 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b   *z ){.      z +
2dd20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2dd30 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20  0(z)+1;.      z 
2dd40 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2dd50 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20  30(z)+1;.    }. 
2dd60 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28     nUri = (int)(
2dd70 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20  &z[1] - zUri);. 
2dd80 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e     assert( nUri>
2dd90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
2dda0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2ddb0 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2ddc0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2ddd0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2dde0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2ddf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2de00 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2de10 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2de20 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2de30 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2de40 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2de50 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2de60 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2de70 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2de80 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2de90 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2dea0 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2deb0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2dec0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2ded0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2dee0 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2def0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2df00 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2df10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2df20 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2df30 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2df40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2df50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2df60 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2df70 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2df80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2df90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
2dfa0 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
2dfb0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2dfc0 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65  ure, PCache obje
2dfd0 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72  ct, the.  ** thr
2dfe0 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ee file descript
2dff0 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ors, the databas
2e000 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  e file name and 
2e010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
2e020 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65  * file name. The
2e030 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72   layout in memor
2e040 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  y is as follows:
2e050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50  .  **.  **     P
2e060 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20  ager object     
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e080 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79  sizeof(Pager) by
2e090 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43  tes).  **     PC
2e0a0 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20  ache object     
2e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2e0c0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2e0d0 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  () bytes).  **  
2e0e0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2e0f0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2e100 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69     (pVfs->szOsFi
2e110 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  le bytes).  **  
2e120 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66     Sub-journal f
2e130 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2e140 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2e150 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2e160 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c      Main journal
2e170 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2e180 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2e190 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2e1a0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2e1b0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2e1c0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2e1d0 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  1 bytes).  **   
2e1e0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e    Journal file n
2e1f0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2e200 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31    (nPathname+8+1
2e210 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70   bytes).  */.  p
2e220 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  Ptr = (u8 *)sqli
2e230 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
2e240 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
2e250 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20  (*pPager)) +    
2e260 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
2e270 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ture */.    ROUN
2e280 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b  D8(pcacheSize) +
2e290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43             /* PC
2e2a0 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
2e2b0 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e     ROUND8(pVfs->
2e2c0 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20  szOsFile) +     
2e2d0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62    /* The main db
2e2e0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75   file */.    jou
2e2f0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32  rnalFileSize * 2
2e300 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   +          /* T
2e310 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
2e320 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
2e330 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2e340 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  i +         /* z
2e350 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Filename */.    
2e360 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20  nPathname + 8 + 
2e370 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2              /
2e380 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  * zJournal */.#i
2e390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e3a0 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74  T_WAL.    + nPat
2e3b0 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20  hname + 4 + 2   
2e3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2e3d0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2e3e0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2e3f0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2e400 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2e410 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2e420 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2e430 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2e440 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2e450 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2e460 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2e470 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  PT;.  }.  pPager
2e480 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
2e490 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
2e4a0 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
2e4b0 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
2e4c0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2e4d0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2e4e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
2e4f0 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
2e500 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2e510 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
2e520 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
2e530 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
2e540 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2e550 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2e560 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
2e570 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
2e580 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
2e590 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2e5a0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e5b0 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
2e5c0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2e5d0 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
2e5e0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2e5f0 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
2e600 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
2e610 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
2e620 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
2e630 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
2e640 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
2e650 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
2e660 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  hname ){.    ass
2e670 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30  ert( nPathname>0
2e680 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2e690 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
2e6a0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
2e6b0 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2e6c0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2e6d0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e6e0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2e6f0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
2e700 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26   nUri ) memcpy(&
2e710 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e720 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20  e[nPathname+1], 
2e730 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
2e740 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2e750 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
2e760 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2e770 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2e780 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2e790 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
2e7a0 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a  nal\000", 8+2);.
2e7b0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2e7c0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2e7d0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2e7e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66  ->zJournal);.#if
2e7f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e800 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d  _WAL.    pPager-
2e810 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
2e820 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2e830 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65  ame+8+1];.    me
2e840 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
2e850 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2e860 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2e870 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57  mcpy(&pPager->zW
2e880 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2e890 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b  -wal\000", 4+1);
2e8a0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2e8b0 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2e8c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2e8d0 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66  r->zWal);.#endif
2e8e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2e8f0 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2e900 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
2e910 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
2e920 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
2e930 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
2e940 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
2e950 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2e960 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2e970 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2e980 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9a0 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
2e9b0 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
2e9c0 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
2e9d0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2e9e0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
2e9f0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2ea00 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
2ea10 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  out);.    assert
2ea20 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20  ( !memDb );.    
2ea30 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
2ea40 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2ea50 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20  DONLY);..    /* 
2ea60 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
2ea70 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
2ea80 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
2ea90 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a  te access,.    *
2eaa0 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
2eab0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
2eac0 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
2ead0 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a  create the.    *
2eae0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
2eaf0 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
2eb00 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
2eb10 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a  ximum of:.    **
2eb20 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c  .    **    + SQL
2eb30 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2eb40 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20  _SIZE,.    **   
2eb50 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
2eb60 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2eb70 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
2eb80 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c     **    + The l
2eb90 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65  argest page size
2eba0 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69   that can be wri
2ebb0 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tten atomically.
2ebc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ebd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ebe0 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d  .      int iDc =
2ebf0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2ec00 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2ec10 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2ec20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79     if( !readOnly
2ec30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53   ){.        setS
2ec40 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2ec50 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2ec60 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2ec70 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2ec80 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2ec90 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2eca0 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
2ecb0 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
2ecc0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2ecd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
2ece0 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
2ecf0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2ed00 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
2ed10 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2ed20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
2ed30 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
2ed40 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2ed50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2ed60 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70  ageDflt = (u32)p
2ed70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2ed80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2ed90 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20         }.#ifdef 
2eda0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2edb0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2edc0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69     {.          i
2edd0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20  nt ii;.         
2ede0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2edf0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
2ee00 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
2ee10 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2ee20 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2ee30 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2ee40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2ee50 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
2ee60 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2ee70 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
2ee80 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
2ee90 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
2eea0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2eeb0 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
2eec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2eed0 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2eee0 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2eef0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2ef00 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2ef10 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ii;.           
2ef20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2ef30 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2ef40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2ef50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73  ager->noLock = s
2ef60 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2ef70 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e  an(zFilename, "n
2ef80 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20  olock", 0);.    
2ef90 20 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c    if( (iDc & SQL
2efa0 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41  ITE_IOCAP_IMMUTA
2efb0 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  BLE)!=0.       |
2efc0 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  | sqlite3_uri_bo
2efd0 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2efe0 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29   "immutable", 0)
2eff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66   ){.          vf
2f000 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2f010 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
2f020 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
2f030 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c  ct_like_temp_fil
2f040 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2f050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2f060 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
2f070 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
2f080 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
2f090 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
2f0a0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
2f0b0 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
2f0c0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2f0d0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
2f0e0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
2f0f0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
2f100 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
2f110 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
2f120 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2f130 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2f140 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
2f150 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2f160 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
2f170 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2f180 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2f190 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
2f1a0 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2f1b0 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
2f1c0 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
2f1d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
2f1e0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
2f1f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2f200 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73  branch also runs
2f210 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65   for files marke
2f220 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a  d as immutable..
2f230 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65      */ .act_like
2f240 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20  _temp_file:.    
2f250 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2f260 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2f270 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2f280 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20       /* Pretend 
2f290 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
2f2a0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50  a lock */.    pP
2f2b0 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58  ager->eLock = EX
2f2c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20  CLUSIVE_LOCK;   
2f2d0 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2f2e0 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  re in EXCLUSIVE 
2f2f0 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67  mode */.    pPag
2f300 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20  er->noLock = 1; 
2f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f320 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  * Do no locking 
2f330 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  */.    readOnly 
2f340 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  = (vfsFlags&SQLI
2f350 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2f360 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
2f370 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
2f380 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
2f390 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
2f3a0 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
2f3b0 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
2f3c0 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
2f3d0 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
2f3e0 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
2f3f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
2f400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f410 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f420 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
2f430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f440 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
2f450 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
2f460 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  lt, -1);.    tes
2f470 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
2f480 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
2f490 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2f4a0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2f4b0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2f4c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45  ITE_OK ){.    nE
2f4d0 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2f4e0 78 74 72 61 29 3b 0a 20 20 20 20 61 73 73 65 72  xtra);.    asser
2f4f0 74 28 20 6e 45 78 74 72 61 3e 3d 38 20 26 26 20  t( nExtra>=8 && 
2f500 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2f510 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f520 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
2f530 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
2f540 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
2f550 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
2f560 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
2f570 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
2f580 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
2f590 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  he);.  }..  /* I
2f5a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2f5b0 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20  red above, free 
2f5c0 74 68 65 20 20 50 61 67 65 72 20 73 74 72 75 63  the  Pager struc
2f5d0 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
2f5e0 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
2f5f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f600 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2f610 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2f620 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
2f630 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
2f640 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
2f650 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
2f660 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
2f670 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  n rc;.  }..  PAG
2f680 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2f690 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2f6a0 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2f6b0 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2f6c0 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2f6d0 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2f6e0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2f6f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2f700 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2f710 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2f720 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67  urnal;.  /* pPag
2f730 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
2f740 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f750 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
2f760 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f770 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
2f780 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
2f790 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2f7a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
2f7b0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2f7c0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
2f7d0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2f7e0 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
2f7f0 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
2f800 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
2f810 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
2f820 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  K; */.  /* pPage
2f830 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
2f840 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
2f850 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
2f860 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
2f870 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2f880 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2f890 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
2f8a0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2f8b0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2f8c0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2f8d0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2f8e0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
2f8f0 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
2f900 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2f910 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
2f920 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2f930 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
2f940 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2f950 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
2f960 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
2f970 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
2f980 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61  u8)readOnly;.  a
2f990 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
2f9a0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
2f9b0 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
2f9c0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
2f9d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2f9e0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2f9f0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
2fa00 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
2fa10 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2fa20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74  ert( pPager->ext
2fa30 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  raSync==0 );.   
2fa40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fa50 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  >syncFlags==0 );
2fa60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2fa70 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2fa80 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2fa90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2faa0 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2fab0 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
2fac0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2fad0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2fae0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2faf0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2fb00 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2fb10 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2fb20 7c 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  | (SQLITE_SYNC_N
2fb30 4f 52 4d 41 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20  ORMAL<<2);.  }. 
2fb40 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2fb50 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
2fb60 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
2fb70 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
2fb80 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
2fb90 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2fba0 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
2fbb0 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
2fbc0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
2fbd0 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
2fbe0 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
2fbf0 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
2fc00 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2fc10 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
2fc20 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
2fc30 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
2fc40 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29  f( !useJournal )
2fc50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2fc60 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2fc70 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2fc80 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d  F;.  }else if( m
2fc90 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
2fca0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2fcb0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2fcc0 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
2fcd0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
2fce0 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
2fcf0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2fd00 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
2fd10 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2fd20 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
2fd30 69 6e 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65  init;.  setGette
2fd40 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
2fd50 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2fd60 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2fd70 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2fd80 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70  ash)); */.  /* p
2fd90 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
2fda0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
2fdb0 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c  MAP_SIZE // will
2fdc0 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65   be set by btree
2fdd0 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  .c */..  *ppPage
2fde0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2fdf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe00 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
2fe10 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2fe20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20  file has not be 
2fe30 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d  deleted or renam
2fe40 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75  ed out from.** u
2fe50 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20  nder the pager. 
2fe60 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2fe70 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  K if the databas
2fe80 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20  e is still were 
2fe90 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62  it ought.** to b
2fea0 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75  e on disk.  Retu
2feb0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c  rn non-zero (SQL
2fec0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2fed0 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68  OVED or some oth
2fee0 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  er error.** code
2fef0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41   from sqlite3OsA
2ff00 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20  ccess()) if the 
2ff10 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e  database has gon
2ff20 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e missing..*/.st
2ff30 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
2ff40 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72  eIsUnmoved(Pager
2ff50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2ff60 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a   bHasMoved = 0;.
2ff70 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2ff80 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ff90 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
2ffa0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2ffb0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
2ffc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ffd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2ffe0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
2fff0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
30000 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20  me[0] );.  rc = 
30010 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
30020 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
30030 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
30040 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f  S_MOVED, &bHasMo
30050 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ved);.  if( rc==
30060 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
30070 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
30080 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d   HAS_MOVED file-
30090 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70  control is unimp
300a0 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65  lemented, assume
300b0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
300c0 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
300d0 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20  en moved.  That 
300e0 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61  is the historica
300f0 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51  l behavior of SQ
30100 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20  Lite: prior to. 
30110 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
30120 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68  8.3, it never ch
30130 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20  ecked */.    rc 
30140 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
30150 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
30160 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f  ITE_OK && bHasMo
30170 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ved ){.    rc = 
30180 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
30190 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72  DBMOVED;.  }.  r
301a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
301b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
301c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
301d0 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
301e0 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
301f0 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
30200 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
30210 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
30220 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
30230 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
30240 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
30250 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
30260 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
30270 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
30280 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
30290 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
302a0 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
302b0 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
302c0 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
302d0 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
302e0 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
302f0 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
30300 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30310 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
30320 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
30330 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
30340 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
30350 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
30360 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
30370 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
30380 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
30390 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
303a0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
303b0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
303c0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
303d0 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
303e0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
303f0 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
30400 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
30410 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
30420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30430 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
30440 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
30450 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
30460 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
30470 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
30480 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
30490 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
304a0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
304b0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
304c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
304d0 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
304e0 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
304f0 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
30500 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
30510 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
30520 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
30530 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
30540 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
30550 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
30560 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
30570 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
30580 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
30590 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
305a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
305b0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
305c0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
305d0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
305e0 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
305f0 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
30600 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
30610 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
30620 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
30630 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
30640 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
30650 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
30660 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
30670 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
30680 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
30690 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
306a0 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
306b0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
306c0 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
306d0 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
306e0 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
306f0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
30700 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
30710 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
30720 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
30730 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
30740 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
30750 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
30760 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
30770 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
30780 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
30790 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
307a0 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
307b0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
307c0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
307d0 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
307e0 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
307f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
30800 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
30810 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
30820 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
30830 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
30840 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
30850 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
30860 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30870 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30880 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
30890 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
308a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
308b0 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
308c0 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
308d0 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
308e0 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
308f0 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
30900 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
30910 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
30920 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
30930 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
30940 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30950 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30960 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
30970 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
30980 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
30990 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
309a0 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
309b0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
309c0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
309d0 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
309e0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
309f0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
30a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30a10 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
30a20 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
30a30 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
30a40 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
30a50 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
30a60 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
30a70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
30a80 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
30a90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
30aa0 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
30ab0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
30ac0 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
30ad0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
30ae0 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
30af0 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
30b00 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
30b10 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
30b20 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
30b30 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
30b40 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
30b50 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
30b60 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
30b70 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
30b80 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
30b90 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
30ba0 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
30bb0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
30bc0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
30bd0 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
30be0 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
30bf0 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
30c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
30c10 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
30c20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
30c30 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
30c40 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
30c50 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
30c60 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
30c70 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
30c80 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
30c90 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
30ca0 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
30cb0 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
30cc0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
30cd0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
30ce0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
30cf0 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
30d00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30d10 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
30d20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
30d30 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
30d40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30d50 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
30d60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
30d70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30d80 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
30d90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
30da0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
30db0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
30dc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30dd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30de0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
30df0 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73  se is zero pages
30e00 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d   in size, that m
30e10 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
30e20 20 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20   (1) the.       
30e30 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61   ** journal is a
30e40 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20   remnant from a 
30e50 70 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77  prior database w
30e60 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
30e70 65 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20  e where.        
30e80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
30e90 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65  file but not the
30ea0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c   journal was del
30eb0 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65  eted, or (2) the
30ec0 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20   initial.       
30ed0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
30ee0 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61  that populates a
30ef0 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
30f00 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
30f10 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
30f20 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
30f30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30f40 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20  can be deleted. 
30f50 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63   However, take c
30f60 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  are.        ** n
30f70 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ot to delete the
30f80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
30f90 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
30fa0 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20  pen due to.     
30fb0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f     ** journal_mo
30fc0 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20  de=PERSIST..    
30fd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
30fe0 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21  f( nPage==0 && !
30ff0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
31000 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
31010 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
31020 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31030 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
31040 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
31050 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
31060 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31070 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
31080 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
31090 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
310a0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
310b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
310c0 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  ) pagerUnlockDb(
310d0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
310e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
310f0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
31100 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
31110 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
31120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
31130 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
31140 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
31150 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
31160 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
31170 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
31180 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
31190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
311a0 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
311b0 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
311c0 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
311d0 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
311e0 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
311f0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
31200 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
31210 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
31220 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
31230 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
31240 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
31250 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
31260 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
31270 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
31280 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
31290 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
312a0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a         int f = .
312b0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
312c0 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f  E_DATA_PROTECTIO
312d0 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
312e0 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
312f0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
31300 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
31310 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
31320 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
31330 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
31340 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
31350 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
31360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31370 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
31380 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
31390 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
313a0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
313b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
313c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
313d0 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69             u8 fi
313e0 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rst = 0;.       
313f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31400 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
31410 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69  jfd, (void *)&fi
31420 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  rst, 1, 0);.    
31430 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31440 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
31450 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
31460 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
31480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31490 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
314a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
314b0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
314c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
314d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
314e0 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
314f0 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a  s = (first!=0);.
31500 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
31510 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
31520 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
31530 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
31540 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  cannot open the 
31550 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
31560 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
31570 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20  o see if.       
31580 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61       ** it has a
31590 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68   zero header, th
315a0 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  at might be due 
315b0 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c  to an I/O error,
315c0 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20   or.            
315d0 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  ** it might be d
315e0 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63  ue to the race c
315f0 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
31600 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a  ed above and in.
31610 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
31620 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69  icket #3883.  Ei
31630 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65  ther way, assume
31640 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
31650 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20  l is hot..      
31660 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
31670 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70  ght be a false p
31680 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66  ositive.  But if
31690 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65   it is, then the
316a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
316b0 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61  automatic journa
316c0 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72  l playback and r
316d0 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73  ecovery mechanis
316e0 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20  m will deal.    
316f0 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
31700 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c  it under an EXCL
31710 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65  USIVE lock where
31720 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
31730 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  to.            *
31740 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20  * worry so much 
31750 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74  with race condit
31760 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20  ions..          
31770 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
31780 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
31790 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
317a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
317b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
317c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
317d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
317e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
317f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31800 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  d to obtain a sh
31810 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
31820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
31830 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
31840 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
31850 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c  PagerGet() until
31860 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
31870 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
31880 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61   successfully ca
31890 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65  lled. If a share
318a0 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  d-lock is alread
318b0 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74  y held when.** t
318c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
318d0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
318e0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
318f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
31900 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70  tions are also p
31910 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73  erformed by this
31920 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
31930 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
31940 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
31950 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
31960 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
31970 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
31980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
31990 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
319a0 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
319b0 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
319c0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
319d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
319e0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
319f0 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
31a00 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
31a10 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
31a20 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
31a30 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
31a40 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
31a50 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
31a60 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
31a70 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
31a80 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
31a90 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
31aa0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
31ab0 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
31ac0 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
31ad0 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
31ae0 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
31af0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
31b00 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
31b10 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
31b20 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
31b30 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
31b40 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
31b50 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
31b60 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
31b70 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
31b80 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
31b90 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
31ba0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
31bb0 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
31bc0 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
31bd0 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
31be0 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
31bf0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
31c00 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
31c10 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
31c20 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
31c30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
31c40 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
31c50 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
31c60 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
31c70 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
31c80 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
31c90 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
31ca0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
31cb0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
31cc0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
31cd0 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
31ce0 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
31cf0 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
31d00 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20  nal file or .** 
31d10 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
31d20 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
31d30 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
31d40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
31d50 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
31d60 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
31d70 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
31d80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31da0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
31db0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
31dc0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
31dd0 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
31de0 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
31df0 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
31e00 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
31e10 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74  . This implies t
31e20 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74  hat the pager st
31e30 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65  ate should eithe
31e40 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f  r.  ** be OPEN o
31e50 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52  r READER. READER
31e60 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
31e70 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  e if the pager i
31e80 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  s or was in .  *
31e90 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  * exclusive acce
31ea0 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61  ss mode.  */.  a
31eb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
31ec0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
31ed0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
31ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
31ef0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31f00 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
31f10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31f20 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
31f30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
31f40 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
31f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
31f60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
31f70 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
31f80 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
31f90 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
31fa0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
31fb0 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74  _OPEN ){.    int
31fc0 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31   bHotJournal = 1
31fd0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
31fe0 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
31ff0 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ts a hot journal
32000 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73  -file */..    as
32010 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
32020 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32030 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
32040 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
32050 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
32060 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   );..    rc = pa
32070 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
32080 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
32090 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
320a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
320b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
320c0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
320d0 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
320e0 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
320f0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  OCK );.      got
32100 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
32110 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
32120 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
32130 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
32140 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
32150 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
32160 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
32170 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
32180 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
32190 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
321a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
321b0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48  Pager->eLock<=SH
321c0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
321d0 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
321e0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62  urnal(pPager, &b
321f0 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
32200 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
32210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32220 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32230 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f     }.    if( bHo
32240 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
32250 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
32260 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
32270 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
32280 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b  ADONLY_ROLLBACK;
32290 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
322a0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
322b0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
322c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
322d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
322e0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
322f0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
32300 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
32310 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
32320 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
32330 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
32340 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
32350 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
32360 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
32370 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
32380 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
32390 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
323a0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
323b0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
323c0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
323d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
323e0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
323f0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
32400 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
32410 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
32420 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
32430 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
32440 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
32450 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
32460 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
32470 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
32480 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
32490 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
324a0 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
324b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
324c0 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
324d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
324e0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
324f0 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
32500 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
32510 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
32520 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
32530 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
32540 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
32550 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
32560 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
32570 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
32580 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20  he lock is.     
32590 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74   ** downgraded t
325a0 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65  o SHARED_LOCK be
325b0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
325c0 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20  on returns..    
325d0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
325e0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
325f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
32600 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
32610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32620 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32630 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  led;.      }. . 
32640 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73       /* If it is
32650 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
32660 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65  n and the file e
32670 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f  xists on disk, o
32680 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  pen the .      *
32690 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  * journal for re
326a0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
326b0 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73   Write access is
326c0 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73   required becaus
326d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65  e .      ** in e
326e0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
326f0 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
32700 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
32710 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20   kept open .    
32720 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c    ** and possibl
32730 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
32740 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
32750 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61  n. Also, write-a
32760 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20  ccess .      ** 
32770 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69  is usually requi
32780 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  red to finalize 
32790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a  the journal in j
327a0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73  ournal_mode=pers
327b0 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  ist .      ** mo
327c0 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72  de (and also for
327d0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72   journal_mode=tr
327e0 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73  uncate on some s
327f0 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a  ystems)..      *
32800 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
32810 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
32820 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75  ot exist, it usu
32830 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  ally means that 
32840 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  some .      ** o
32850 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
32860 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
32870 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
32880 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
32890 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
328a0 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
328b0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
328c0 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
328d0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
328e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
328f0 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
32900 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
32910 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
32920 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e  on was called an
32930 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
32940 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
32950 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
32960 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
32970 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
32980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
32990 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
329a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
329b0 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73         int bExis
329c0 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
329d0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
329e0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
329f0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
32a00 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
32a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
32a20 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32a30 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
32a40 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69  SS_EXISTS, &bExi
32a50 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sts);.        if
32a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32a70 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20  && bExists ){.  
32a80 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
32a90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
32aa0 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53 51 4c  int f = .#if SQL
32ab0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
32ac0 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
32ad0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
32ae0 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
32af0 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
32b00 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
32b10 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  f.            SQ
32b20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
32b30 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
32b40 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
32b50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32b60 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
32b70 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
32b80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
32b90 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
32ba0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
32bb0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
32bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
32bd0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
32be0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
32bf0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
32c00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32c10 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
32c20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
32c30 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
32c40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32c50 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
32c60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
32c70 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
32c80 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
32c90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
32ca0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
32cb0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
32cc0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
32cd0 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
32ce0 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
32cf0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
32d00 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
32d10 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
32d20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
32d30 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
32d40 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
32d50 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
32d60 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
32d70 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
32d80 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
32d90 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
32da0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
32db0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
32dc0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
32dd0 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
32de0 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
32df0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
32e00 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
32e10 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
32e20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
32e30 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
32e40 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
32e50 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
32e60 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
32e70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
32e80 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
32e90 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
32ea0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32eb0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
32ec0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
32ed0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
32ee0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
32ef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32f00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32f10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
32f20 70 50 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d  pPager, !pPager-
32f30 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
32f40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
32f50 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
32f60 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
32f70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
32f80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32f90 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
32fa0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
32fb0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
32fc0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
32fd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
32ff0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
33000 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
33010 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
33020 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
33030 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
33040 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
33050 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
33060 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
33070 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
33080 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
33090 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
330a0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
330b0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
330c0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
330d0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
330e0 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
330f0 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
33100 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
33110 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
33120 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
33130 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
33140 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
33150 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
33160 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
33170 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
33180 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
33190 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
331a0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
331b0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
331c0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
331d0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
331e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
331f0 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
33200 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
33210 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
33220 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
33230 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
33240 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
33250 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
33260 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
33270 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
33280 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
33290 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
332a0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
332b0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
332c0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
332d0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
332e0 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
332f0 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
33300 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
33310 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
33320 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
33330 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
33340 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
33350 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
33360 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
33370 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
33380 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
33390 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
333a0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
333b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
333c0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
333d0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
333e0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
333f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
33400 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33410 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
33420 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
33430 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
33440 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
33450 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
33460 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
33470 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
33480 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
33490 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
334a0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
334b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70  r->tempFile && p
334c0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
334d0 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  aredLock ){.    
334e0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
334f0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
33500 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e  en acquired then
33510 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   check to.      
33520 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61  ** see if the da
33530 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
33540 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
33550 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
33560 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a  hanged,.      **
33570 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
33580 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64 53 68  .  The hasHeldSh
33590 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72  aredLock flag pr
335a0 65 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d  events this from
335b0 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
335c0 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20  ing on the very 
335d0 66 69 72 73 74 20 61 63 63 65 73 73 20 74 6f 20  first access to 
335e0 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72  a file, in order
335f0 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20   to save a.     
33600 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63   ** single unnec
33610 65 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73  essary sqlite3Os
33620 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74  Read() call at t
33630 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20  he start-up..   
33640 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
33650 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
33660 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
33670 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
33680 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
33690 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
336a0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
336b0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
336c0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
336d0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
336e0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
336f0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
33700 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
33710 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
33720 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
33730 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
33740 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
33750 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
33760 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
33770 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
33780 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
33790 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
337a0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
337b0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
337c0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
337d0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
337e0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
337f0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
33800 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
33810 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
33820 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
33830 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
33840 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
33850 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
33860 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20  ileVers)];..    
33870 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
33880 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
33890 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
338a0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
338b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
338c0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
338d0 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
338e0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
338f0 20 32 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20   24);.      if( 
33900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33910 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
33920 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
33930 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
33940 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
33950 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
33960 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
33970 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
33980 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
33990 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
339a0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
339b0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
339c0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
339d0 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
339e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
339f0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
33a00 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d  ..        /* Unm
33a10 61 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ap the database 
33a20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73  file. It is poss
33a30 69 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e  ible that extern
33a40 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20  al processes.   
33a50 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65       ** may have
33a60 20 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64   truncated the d
33a70 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
33a80 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69   then extended i
33a90 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a  t back.        *
33aa0 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  * to its origina
33ab0 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69  l size while thi
33ac0 73 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f  s process was no
33ad0 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  t holding a lock
33ae0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
33af0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
33b00 6d 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65  may exist a Page
33b10 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74  r.pMap mapping t
33b20 68 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20  hat appears.    
33b30 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65      ** to be the
33b40 20 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20   right size but 
33b50 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
33b60 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69  valid. Avoid thi
33b70 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  s.        ** pos
33b80 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61  sibility by unma
33b90 70 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72  pping the db her
33ba0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  e. */.        if
33bb0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
33bc0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
33bd0 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
33be0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
33bf0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
33c00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
33c10 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
33c20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
33c30 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
33c40 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
33c50 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
33c60 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
33c70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
33c80 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
33c90 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
33ca0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
33cb0 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
33cc0 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20  Pager);.#ifndef 
33cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
33ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33cf0 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72  er->pWal==0 || r
33d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
33d10 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
33d20 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
33d30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
33d40 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
33d50 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
33d60 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
33d70 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
33d80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
33d90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
33da0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
33db0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
33dc0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
33dd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
33de0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
33df0 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
33e00 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
33e10 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
33e20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
33e30 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
33e40 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
33e50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
33e60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33e70 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
33e80 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
33e90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
33ea0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
33eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48      pPager->hasH
33ec0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20  eldSharedLock = 
33ed0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
33ee0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
33ef0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
33f00 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
33f10 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61  zero, rollback a
33f20 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  ny active.** tra
33f30 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
33f40 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  ock the pager..*
33f50 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20  *.** Except, in 
33f60 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
33f70 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72  LUSIVE when ther
33f80 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
33f90 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  in.** the rollba
33fa0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20  ck journal, the 
33fb0 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65  unlock is not pe
33fc0 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72  rformed and ther
33fd0 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  e is.** nothing 
33fe0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20  to rollback, so 
33ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
34000 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61  a no-op..*/ .sta
34010 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
34020 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
34030 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
34040 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
34050 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
34060 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a  >pPCache)==0 ){.
34070 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34080 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20  er->nMmapOut==0 
34090 29 3b 20 2f 2a 20 62 65 63 61 75 73 65 20 70 61  ); /* because pa
340a0 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d  ge1 is never mem
340b0 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20  ory mapped */.  
340c0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
340d0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
340e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
340f0 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20 6d  he page getter m
34100 65 74 68 6f 64 73 20 65 61 63 68 20 74 72 79 20  ethods each try 
34110 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 66  to acquire a ref
34120 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70  erence to a.** p
34130 61 67 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  age with page nu
34140 6d 62 65 72 20 70 67 6e 6f 2e 20 49 66 20 74 68  mber pgno. If th
34150 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
34160 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
34170 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
34180 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
34190 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
341a0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
341b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ed..**.** There 
341c0 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 69 6d  are different im
341d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
341e0 20 74 68 65 20 67 65 74 74 65 72 20 6d 65 74 68   the getter meth
341f0 6f 64 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  od depending.** 
34200 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  on the current s
34210 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
34220 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74  r..**.**     get
34230 50 61 67 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20  PageNormal()    
34240 20 20 20 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72       --  The nor
34250 6d 61 6c 20 67 65 74 74 65 72 0a 2a 2a 20 20 20  mal getter.**   
34260 20 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 29    getPageError()
34270 20 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73            --  Us
34280 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
34290 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
342a0 74 61 74 65 0a 2a 2a 20 20 20 20 20 67 65 74 50  tate.**     getP
342b0 61 67 65 4d 6d 61 70 28 29 20 20 20 20 20 20 20  ageMmap()       
342c0 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20      --  Used if 
342d0 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
342e0 4f 20 69 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a  O is enabled.**.
342f0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
34300 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
34310 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
34320 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
34330 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
34340 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
34350 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
34360 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
34370 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
34380 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34390 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
343a0 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
343b0 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
343c0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
343d0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
343e0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
343f0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
34400 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
34410 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
34420 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
34430 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
34440 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
34450 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
34460 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
34470 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
34480 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
34490 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
344a0 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
344b0 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
344c0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
344d0 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
344e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
344f0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
34500 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
34510 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
34520 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
34530 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
34540 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
34550 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
34560 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
34570 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
34580 20 6f 72 20 69 66 20 0a 2a 2a 20 74 68 65 20 66   or if .** the f
34590 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
345a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 41 47 45  ontains the PAGE
345b0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
345c0 62 69 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  bit and the .** 
345d0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
345e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
345f0 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
34600 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
34610 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
34620 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
34630 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
34640 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
34650 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
34660 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
34670 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47  s. .**.** If PAG
34680 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34690 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
346a0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
346b0 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
346c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
346d0 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
346e0 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65  ccurs in two sce
346f0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
34700 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
34710 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
34720 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
34730 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
34740 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
34750 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
34760 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
34770 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
34780 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
34790 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
347a0 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
347b0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
347c0 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
347d0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
347e0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
347f0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
34800 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20 74 68  TENT is true, th
34810 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
34820 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
34830 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69  nstead.** of bei
34840 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
34850 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
34860 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
34870 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
34880 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
34890 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
348a0 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
348b0 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
348c0 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
348d0 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
348e0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
348f0 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
34900 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
34910 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
34920 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
34930 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
34940 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
34950 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
34960 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
34970 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
34980 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34990 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
349a0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
349b0 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
349c0 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
349d0 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
349e0 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
349f0 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
34a00 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
34a10 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
34a20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
34a30 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
34a40 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
34a50 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
34a60 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
34a70 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
34a80 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
34a90 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
34aa0 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
34ab0 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
34ac0 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
34ad0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
34ae0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
34af0 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
34b00 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
34b10 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
34b20 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
34b30 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
34b40 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
34b50 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
34b60 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
34b70 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
34b80 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
34b90 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
34ba0 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
34bb0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
34bc0 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
34bd0 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
34be0 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
34bf0 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
34c00 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
34c10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
34c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
34c30 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20  etPageNormal(.  
34c40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
34c50 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
34c60 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
34c70 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
34c80 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
34c90 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
34ca0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
34cb0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
34cc0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
34cd0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
34ce0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
34cf0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
34d00 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
34d10 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
34d20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34d30 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
34d40 67 3b 0a 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e  g;.  u8 noConten
34d50 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
34d60 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
34d70 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
34d80 45 4e 54 20 69 73 20 73 65 74 20 2a 2f 0a 20 20  ENT is set */.  
34d90 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
34da0 61 67 65 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61  age *pBase;..  a
34db0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
34dc0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
34dd0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
34de0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
34df0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
34e00 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
34e10 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
34e20 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
34e30 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
34e40 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b  SharedLock==1 );
34e50 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
34e60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
34e70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34e80 70 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50  pBase = sqlite3P
34e90 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
34ea0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
34eb0 2c 20 33 29 3b 0a 20 20 69 66 28 20 70 42 61 73  , 3);.  if( pBas
34ec0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 67 20  e==0 ){.    pPg 
34ed0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
34ee0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34ef0 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Stress(pPager->p
34f00 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70  PCache, pgno, &p
34f10 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Base);.    if( r
34f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34f30 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34f40 65 5f 65 72 72 3b 0a 20 20 20 20 69 66 28 20 70  e_err;.    if( p
34f50 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Base==0 ){.     
34f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
34f70 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
34f80 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34f90 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_err;.    }.  }
34fa0 0a 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65  .  pPg = *ppPage
34fb0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34fc0 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67  FetchFinish(pPag
34fd0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34fe0 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 61 73 73  o, pBase);.  ass
34ff0 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61  ert( pPg==(*ppPa
35000 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
35010 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f   pPg->pgno==pgno
35020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35030 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
35040 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  r || pPg->pPager
35050 3d 3d 30 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74  ==0 );..  noCont
35060 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ent = (flags & P
35070 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
35080 4e 54 29 21 3d 30 3b 0a 20 20 69 66 28 20 70 50  NT)!=0;.  if( pP
35090 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  g->pPager && !no
350a0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
350b0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
350c0 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
350d0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
350e0 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
350f0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
35100 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
35110 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
35120 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
35130 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
35140 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
35150 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
35160 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
35170 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
35180 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72  AT_HIT]++;.    r
35190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
351a0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
351b0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
351c0 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
351d0 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
351e0 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
351f0 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
35200 6c 69 7a 65 64 2e 20 42 75 74 20 66 69 72 73 74  lized. But first
35210 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 68 65 63   some error chec
35220 6b 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ks:.    **.    *
35230 2a 20 28 31 29 20 54 68 65 20 6d 61 78 69 6d 75  * (1) The maximu
35240 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
35250 20 32 5e 33 31 0a 20 20 20 20 2a 2a 20 28 32 29   2^31.    ** (2)
35260 20 4e 65 76 65 72 20 74 72 79 20 74 6f 20 66 65   Never try to fe
35270 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
35280 70 61 67 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  page.    */.    
35290 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
352a0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
352b0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
352c0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
352d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
352e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
352f0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35300 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
35310 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
35320 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 61 73   pPager;..    as
35330 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
35340 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45  ager->fd) || !ME
35350 4d 44 42 20 29 3b 0a 20 20 20 20 69 66 28 20 21  MDB );.    if( !
35360 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
35370 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  d) || pPager->db
35380 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43  Size<pgno || noC
35390 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
353a0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
353b0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
353c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
353d0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
353e0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
353f0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
35400 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
35410 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
35420 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
35430 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
35440 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
35450 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
35460 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
35470 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
35480 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
35490 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
354a0 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
354b0 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
354c0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
354d0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
354e0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
354f0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
35500 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
35510 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
35520 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
35530 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
35540 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
35550 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
35560 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
35570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
35580 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
35590 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
355a0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
355b0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
355c0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
355d0 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
355e0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
355f0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
35600 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
35610 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
35620 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
35630 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
35640 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
35650 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
35660 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
35670 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
35680 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
35690 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
356a0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
356b0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
356c0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
356d0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
356e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
356f0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
35700 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
35710 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
35720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35730 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
35740 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
35750 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
35760 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d  tat[PAGER_STAT_M
35770 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63  ISS]++;.      rc
35780 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
35790 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
357a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
357b0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
357c0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
357d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
357e0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
357f0 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ash(pPg);.  }.  
35800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35810 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
35820 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
35830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
35840 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
35850 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
35860 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
35870 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
35880 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2a  sed(pPager);.  *
35890 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
358a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
358b0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
358c0 53 49 5a 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61  SIZE>0./* The pa
358d0 67 65 20 67 65 74 74 65 72 20 66 6f 72 20 77 68  ge getter for wh
358e0 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  en memory-mapped
358f0 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 20   I/O is enabled 
35900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
35910 74 50 61 67 65 4d 4d 61 70 28 0a 20 20 50 61 67  tPageMMap(.  Pag
35920 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
35930 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
35940 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
35950 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
35960 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
35970 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
35980 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
35990 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
359a0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
359b0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
359c0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
359d0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
359e0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
359f0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
35a00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35a10 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ;.  PgHdr *pPg =
35a20 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65   0;.  u32 iFrame
35a30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
35a40 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74        /* Frame t
35a50 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20  o read from WAL 
35a60 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74  file */..  /* It
35a70 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
35a80 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
35a90 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
35aa0 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
35ab0 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
35ac0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
35ad0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
35ae0 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
35af0 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
35b00 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
35b10 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
35b20 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
35b30 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
35b40 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
35b50 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
35b60 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
35b70 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
35b80 20 3d 20 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26   = (pgno>1.   &&
35b90 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
35ba0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
35bb0 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
35bc0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  _GET_READONLY)).
35bd0 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
35be0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
35bf0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
35c00 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 61 73  E_HAS_CODEC.  as
35c10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 78 43  sert( pPager->xC
35c20 6f 64 65 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  odec==0 );.#endi
35c30 66 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61  f..  /* Optimiza
35c40 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69  tion note:  Addi
35c50 6e 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22  ng the "pgno<=1"
35c60 20 74 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67   term before "pg
35c70 6e 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a  no==0" here.  **
35c80 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70   allows the comp
35c90 69 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74  iler optimizer t
35ca0 6f 20 72 65 75 73 65 20 74 68 65 20 72 65 73 75  o reuse the resu
35cb0 6c 74 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f  lts of the "pgno
35cc0 3e 31 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e  >1".  ** test in
35cd0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74   the previous st
35ce0 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f  atement, and avo
35cf0 69 64 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d  id testing pgno=
35d00 3d 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63  =0 in the.  ** c
35d10 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
35d20 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20   pgno is large. 
35d30 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31  */.  if( pgno<=1
35d40 20 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20   && pgno==0 ){. 
35d50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35d60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35d70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
35d80 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
35d90 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
35da0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
35db0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
35dc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35dd0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
35de0 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  aredLock==1 );. 
35df0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35e00 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
35e10 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d  _OK );..  if( bM
35e20 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73  mapOk && pagerUs
35e30 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
35e40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35e50 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
35e60 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
35e70 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69   &iFrame);.    i
35e80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35e90 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
35ea0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
35eb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
35ec0 7d 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20  }.  if( bMmapOk 
35ed0 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a  && iFrame==0 ){.
35ee0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
35ef0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
35f00 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61  lite3OsFetch(pPa
35f10 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20  ger->fd, .      
35f20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20    (i64)(pgno-1) 
35f30 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
35f40 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ze, pPager->page
35f50 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20  Size, &pData.   
35f60 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
35f70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
35f80 74 61 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ta ){.      if( 
35f90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
35fa0 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 70  AGER_READER || p
35fb0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
35fc0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d  ){.        pPg =
35fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
35fe0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
35ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36000 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
36010 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
36020 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
36030 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44  pPager, pgno, pD
36040 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ata, &pPg);.    
36050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36060 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
36070 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
36080 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
36090 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
360a0 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
360b0 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
360c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
360d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
360e0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
360f0 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65   pPg;.        re
36100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  _OK ){.      *pp
36140 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
36150 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65  .  }.  return ge
36170 74 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67  tPageNormal(pPag
36180 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
36190 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64  , flags);.}.#end
361a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
361b0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
361c0 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  ./* The page get
361d0 74 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77  ter method for w
361e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
361f0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
36200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
36210 74 50 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61  tPageError(.  Pa
36220 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
36230 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
36240 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
36250 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
36260 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
36270 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36280 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
36290 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
362a0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
362b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
362c0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
362d0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
362e0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
362f0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55   flags */.){.  U
36300 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36310 70 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pgno);.  UNUSED_
36320 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
36330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36340 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
36350 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50  ITE_OK );.  *ppP
36360 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
36370 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
36380 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74  e;.}.../* Dispat
36390 63 68 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63  ch all page fetc
363a0 68 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68  h requests to th
363b0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 67 65  e appropriate ge
363c0 74 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  tter method..*/.
363d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
363e0 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Get(.  Pager *pP
363f0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
36400 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
36410 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36420 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
36430 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
36440 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
36450 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
36460 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
36470 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
36480 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
36490 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
364a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
364b0 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
364c0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  */.){.  return p
364d0 50 61 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67  Pager->xGet(pPag
364e0 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
364f0 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
36500 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
36510 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
36520 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
36530 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
36540 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
36550 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
36560 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
36570 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
36580 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
36590 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
365a0 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
365b0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
365c0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
365d0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
365e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
365f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
36600 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
36610 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
36620 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
36630 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
36640 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
36650 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
36660 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
36670 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
36680 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
36690 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
366a0 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
366b0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
366c0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
366d0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
366e0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
366f0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
36700 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70  no){.  sqlite3_p
36710 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67  cache_page *pPag
36720 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
36730 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
36740 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
36750 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36760 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
36770 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   pPage = sqlite3
36780 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
36790 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
367a0 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
367b0 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61   pPage==0 || pPa
367c0 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
367d0 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20  edLock );.  if( 
367e0 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  pPage==0 ) retur
367f0 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  n 0;.  return sq
36800 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
36810 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
36820 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50  PCache, pgno, pP
36830 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  age);.}../*.** R
36840 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
36850 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  ference..**.** T
36860 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  he sqlite3PagerU
36870 6e 72 65 66 28 29 20 61 6e 64 20 73 71 6c 69 74  nref() and sqlit
36880 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
36890 75 6c 6c 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ull() may only b
368a0 65 0a 2a 2a 20 75 73 65 64 20 69 66 20 77 65 20  e.** used if we 
368b0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61  know that the pa
368c0 67 65 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65  ge being release
368d0 64 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  d is not the las
368e0 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62  t page..** The b
368f0 74 72 65 65 20 6c 61 79 65 72 20 61 6c 77 61 79  tree layer alway
36900 73 20 68 6f 6c 64 73 20 70 61 67 65 31 20 6f 70  s holds page1 op
36910 65 6e 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64  en until the end
36920 2c 20 73 6f 20 74 68 65 73 65 20 66 69 72 73 74  , so these first
36930 0a 2a 2a 20 74 6f 20 72 6f 75 74 69 6e 65 73 20  .** to routines 
36940 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
36950 65 6c 65 61 73 65 20 61 6e 79 20 70 61 67 65 20  elease any page 
36960 6f 74 68 65 72 20 74 68 61 6e 20 42 74 53 68 61  other than BtSha
36970 72 65 64 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a  red.pPage1..**.*
36980 2a 20 55 73 65 20 73 71 6c 69 74 65 33 50 61 67  * Use sqlite3Pag
36990 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 29  erUnrefPageOne()
369a0 20 74 6f 20 72 65 6c 65 61 73 65 20 70 61 67 65   to release page
369b0 31 2e 20 20 54 68 69 73 20 6c 61 74 74 65 72 20  1.  This latter 
369c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b  routine.** check
369d0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
369e0 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
369f0 67 20 70 61 67 65 73 20 61 6e 64 20 69 66 20 74  g pages and if t
36a00 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
36a10 70 61 67 65 73 20 72 65 61 63 68 65 73 20 7a 65  pages reaches ze
36a20 72 6f 20 69 74 20 64 72 6f 70 73 20 74 68 65 20  ro it drops the 
36a30 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a  database lock..*
36a40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
36a50 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36a60 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
36a70 54 45 53 54 4f 4e 4c 59 28 20 50 61 67 65 72 20  TESTONLY( Pager 
36a80 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
36a90 50 61 67 65 72 3b 20 29 0a 20 20 61 73 73 65 72  Pager; ).  asser
36aa0 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 69  t( pPg!=0 );.  i
36ab0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  f( pPg->flags & 
36ac0 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20  PGHDR_MMAP ){.  
36ad0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
36ae0 67 6e 6f 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61  gno!=1 );  /* Pa
36af0 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d  ge1 is never mem
36b00 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20  ory mapped */.  
36b10 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
36b20 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  pPage(pPg);.  }e
36b30 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
36b40 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
36b50 67 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20  g);.  }.  /* Do 
36b60 6e 6f 74 20 75 73 65 20 74 68 69 73 20 72 6f 75  not use this rou
36b70 74 69 6e 65 20 74 6f 20 72 65 6c 65 61 73 65 20  tine to release 
36b80 74 68 65 20 6c 61 73 74 20 72 65 66 65 72 65 6e  the last referen
36b90 63 65 20 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20  ce to page1 */. 
36ba0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36bb0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
36bc0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
36bd0 30 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  0 );.}.void sqli
36be0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
36bf0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
36c00 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50  ( pPg ) sqlite3P
36c10 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
36c20 28 70 50 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  (pPg);.}.void sq
36c30 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50  lite3PagerUnrefP
36c40 61 67 65 4f 6e 65 28 44 62 50 61 67 65 20 2a 70  ageOne(DbPage *p
36c50 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36c60 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
36c70 70 50 67 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pPg!=0 );.  asse
36c80 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31  rt( pPg->pgno==1
36c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
36ca0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
36cb0 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a  R_MMAP)==0 ); /*
36cc0 20 50 61 67 65 31 20 69 73 20 6e 65 76 65 72 20   Page1 is never 
36cd0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f  memory mapped */
36ce0 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
36cf0 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74  >pPager;.  sqlit
36d00 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
36d10 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  pPg);.  pagerUnl
36d20 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
36d30 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  er);.}../*.** Th
36d40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
36d50 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
36d60 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
36d70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
36d80 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
36d90 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
36da0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
36db0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
36dc0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
36dd0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
36de0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
36df0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
36e00 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
36e10 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
36e20 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
36e30 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
36e40 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
36e50 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
36e60 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
36e70 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
36e80 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
36e90 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
36ea0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
36eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
36ec0 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
36ed0 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
36ee0 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
36ef0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
36f00 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
36f10 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
36f20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
36f30 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
36f40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
36f50 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
36f60 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
36f70 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
36f80 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
36f90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
36fa0 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
36fb0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
36fc0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
36fd0 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
36fe0 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
36ff0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
37000 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
37010 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
37020 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
37030 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
37040 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
37050 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
37060 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
37070 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
37080 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
37090 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
370a0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
370b0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
370c0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
370d0 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
370e0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
370f0 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
37100 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
37110 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
37120 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
37130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37140 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
37150 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
37160 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37170 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
37180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37190 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
371a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
371b0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
371c0 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
371d0 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
371e0 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
371f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37200 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37210 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
37220 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
37230 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
37240 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
37250 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
37260 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
37270 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
37280 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
37290 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
372a0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
372b0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
372c0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
372d0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
372e0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
372f0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
37300 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
37310 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
37320 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
37330 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
37340 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
37350 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
37360 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
37370 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
37380 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37390 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
373a0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
373b0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
373c0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
373d0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
373e0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
373f0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
37400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
37410 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
37420 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
37430 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
37440 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
37450 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
37460 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
37470 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
37480 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
37490 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
374a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
374b0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
374c0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
374d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
374e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
374f0 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
37500 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
37510 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
37520 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
37530 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c        int nSpill
37540 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
37550 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
37560 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 66 6c 61  TION.        fla
37570 67 73 20 7c 3d 20 28 70 50 61 67 65 72 2d 3e 76  gs |= (pPager->v
37580 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
37590 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49  PEN_FILEPROTECTI
375a0 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65 6e 64 69 66  ON_MASK);.#endif
375b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
375c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
375d0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
375e0 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
375f0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
37600 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
37610 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
37620 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c      nSpill = sql
37630 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74  ite3Config.nStmt
37640 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  Spill;.        }
37650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
37660 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
37670 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
37680 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70  L;.          nSp
37690 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72  ill = jrnlBuffer
376a0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
376b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
376c0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65    .        /* Ve
376d0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
376e0 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73  tabase still has
376f0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
37700 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20  s it did when.  
37710 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20        ** it was 
37720 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
37730 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  d. */.        rc
37740 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d   = databaseIsUnm
37750 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  oved(pPager);.  
37760 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37780 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37790 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20  3JournalOpen (. 
377a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
377b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
377c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
377d0 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a  , flags, nSpill.
377e0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
377f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37800 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
37810 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
37820 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
37830 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
37840 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
37850 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
37860 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
37870 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
37880 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
37890 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
378a0 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
378b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
378c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
378d0 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
378e0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
378f0 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
37900 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
37910 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
37920 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37930 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
37940 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
37950 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
37960 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
37970 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
37980 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
37990 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
379a0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
379b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
379c0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
379d0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
379e0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
379f0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37a00 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
37a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37a20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37a30 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37a40 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
37a50 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
37a60 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
37a70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
37a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
37a90 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
37aa0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
37ab0 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
37ac0 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
37ad0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
37ae0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
37af0 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
37b00 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
37b10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
37b20 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
37b30 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
37b40 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
37b50 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
37b60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
37b70 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
37b80 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
37b90 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
37ba0 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
37bb0 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
37bc0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
37bd0 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
37be0 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
37bf0 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
37c00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
37c10 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
37c20 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
37c30 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
37c40 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
37c50 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
37c60 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
37c70 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
37c80 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
37c90 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
37ca0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
37cb0 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
37cc0 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
37cd0 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
37ce0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
37cf0 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
37d00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
37d10 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
37d20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
37d30 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
37d40 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
37d50 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
37d60 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
37d70 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
37d80 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
37d90 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
37da0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
37db0 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
37dc0 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
37dd0 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
37de0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37df0 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
37e00 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
37e10 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
37e20 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
37e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
37e40 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
37e50 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
37e60 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
37e70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37e80 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
37e90 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
37ea0 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
37eb0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
37ec0 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
37ed0 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
37ee0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
37ef0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37f00 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
37f10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37f20 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
37f30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
37f40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
37f50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
37f60 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
37f70 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
37f80 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
37f90 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
37fa0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
37fb0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
37fc0 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
37fd0 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
37fe0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
37ff0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
38000 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
38010 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
38020 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
38030 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
38040 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
38050 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
38060 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
38070 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
38080 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
38090 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
380a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
380b0 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
380c0 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
380d0 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
380e0 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 1);.      }.
380f0 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74  .      /* Grab t
38100 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
38110 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
38120 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70  f successful, up
38130 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a  grade to.      *
38140 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
38150 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
38160 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
38170 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
38180 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  aller..      ** 
38190 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  The busy-handler
381a0 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20   is not invoked 
381b0 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  if another conne
381c0 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20  ction already.  
381d0 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65      ** holds the
381e0 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20   write-lock. If 
381f0 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70  possible, the up
38200 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63  per layer will c
38210 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  all it..      */
38220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
38230 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
38240 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
38250 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d  er->pWal);.    }
38260 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  else{.      /* O
38270 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
38280 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
38290 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
382a0 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
382b0 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ter.      ** is 
382c0 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
382d0 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
382e0 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
382f0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
38300 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
38310 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
38320 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
38330 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
38340 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a  XCLUSIVE.      *
38350 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20  * lock, but not 
38360 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74  when obtaining t
38370 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
38380 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
38390 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
383a0 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
383b0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
383c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
383d0 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20  K && exFlag ){. 
383e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
383f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
38400 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
38410 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
38420 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
38430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
38440 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
38450 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  to WRITER_LOCKED
38460 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
38470 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
38480 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53  de sets Pager.eS
38490 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52  tate to PAGER_WR
384a0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43  ITER_LOCKED or C
384b0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a  ACHEMOD.      **
384c0 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20   when it has an 
384d0 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
384e0 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44  , but never to D
384f0 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44  BMOD or FINISHED
38500 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
38510 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
38520 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63  ose states the c
38530 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ode to roll back
38540 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
38550 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
38560 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20  s may copy data 
38570 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
38580 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61  rnal into the da
38590 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a  tabase .      **
385a0 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73   file as well as
385b0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63   into the page c
385c0 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c  ache. Which woul
385d0 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69  d be incorrect i
385e0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  n .      ** WAL 
385f0 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
38600 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
38610 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
38620 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  ER_LOCKED;.     
38630 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
38640 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
38650 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
38660 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
38670 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
38680 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
38690 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
386a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
386b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
386c0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lOff = 0;.    }.
386d0 0a 20 20 20 20 61 73 73 65