/ Hex Artifact Content
Login

Artifact 8f2611ef1eb92a18e1605cb4ff37dfcc05acc6000eb6c6c263105ef5aba54661:


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: 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
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 2c 20 77   hits, misses, w
8630: 72 69 74 65 73 2c 20 73 70 69 6c 6c 73 20 2a 2f  rites, spills */
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8650: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
8680: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
8690: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
86a0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
86b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
86c0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
86d0: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
86e0: 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65  int (*xGet)(Page
86f0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
8700: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8710: 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74  e to fetch a pat
8720: 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ch */.#ifdef SQL
8730: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8740: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8750: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8760: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8770: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8780: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8790: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
87a0: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
87b0: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87c0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87d0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87e0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8800: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
8810: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8820: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8840: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8850: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8860: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8870: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8890: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
88a0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
88b0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88c0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88e0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
8900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8910: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8940: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8950: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8960: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8990: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
89a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
89b0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89c0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89d0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89e0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
8a00: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a10: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a20: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a30: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a40: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a50: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a60: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a80: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a90: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8aa0: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8ab0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ac0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ad0: 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f 2a 0a  TAT_SPILL 3../*.
8ae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8af0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8b00: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8b10: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b20: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b30: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b40: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b50: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b60: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8ba0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8bb0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8bc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8be0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8c10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c30: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c40: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c50: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c90: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8ca0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8cb0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8cc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cd0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8ce0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cf0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8d00: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8d10: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d20: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d30: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d40: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d50: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d60: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d70: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8da0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8db0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8dc0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8dd0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8df0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8e00: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8e10: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e20: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e40: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e50: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e60: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e70: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8ea0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8eb0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ec0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8ed0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ee0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ef0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8f00: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8f10: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f30: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f50: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f60: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f70: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f80: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f90: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8fa0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8fb0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fc0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fe0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8ff0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
9000: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
9010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9020: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9040: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9050: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9060: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9070: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9080: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9090: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
90a0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
90b0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90d0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90e0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90f0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
9100: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
9110: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9120: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9130: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9140: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9150: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9160: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9170: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9180: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9190: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
91a0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
91b0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91c0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91d0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91e0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
9200: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
9210: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9220: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9230: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9240: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9260: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9270: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9290: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
9300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
9310: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9320: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9330: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9340: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9350: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9360: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9370: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9380: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9390: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
93a0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
93b0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93c0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93f0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
9400: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
9410: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9420: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9430: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9450: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9460: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9470: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9480: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9490: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
94a0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
94b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94d0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94f0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9520: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9530: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9540: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9550: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9560: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9570: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9580: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9590: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
95a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
95b0: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95c0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95d0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95e0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95f0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
9600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
9610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9650: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9660: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9670: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9690: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
96a0: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
96b0: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96c0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96d0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96e0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96f0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
9700: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
9710: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9720: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9730: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9740: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9750: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9760: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9770: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9780: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9790: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
97a0: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
97b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97c0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97d0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97e0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97f0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
9800: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
9810: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9820: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9830: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9850: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9860: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9870: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9880: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9890: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
98a0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
98b0: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98c0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
9900: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
9910: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9920: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9930: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9940: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9960: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9970: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9980: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9990: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
99a0: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
99b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99c0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99d0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99e0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99f0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
9a00: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
9a10: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a20: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a30: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a40: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a50: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a60: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a70: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a80: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a90: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9aa0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9ab0: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9ac0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ad0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ae0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9af0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9b00: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9b10: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b20: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b30: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b40: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b50: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b60: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b70: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b80: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b90: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9ba0: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9bb0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9bc0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bd0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9be0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bf0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9c00: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9c10: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c20: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c30: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c40: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c50: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c60: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c70: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c80: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c90: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9ca0: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9cb0: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9cc0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cd0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9ce0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9d00: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9d10: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d20: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d30: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d40: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d50: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d60: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d70: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d80: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9db0: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9dc0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9dd0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9de0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9df0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9e00: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9e10: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e30: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e50: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e70: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e80: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e90: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9ea0: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9eb0: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ec0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9ed0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ee0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ef0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9f00: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9f10: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f20: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f30: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f40: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f50: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f60: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f70: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f80: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f90: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9fa0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9fb0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fc0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fd0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fe0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9ff0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
a000: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
a010: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a030: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a050: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a060: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a070: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a080: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a090: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a0a0: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a0b0: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0c0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0e0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a100: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a110: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a120: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a130: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a140: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a150: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a160: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a170: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a180: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a190: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a1a0: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a1b0: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1c0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1d0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1e0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1f0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a200: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a210: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a220: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a230: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a240: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a260: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a270: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a280: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a290: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a2a0: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a2b0: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2c0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2d0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2e0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a300: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a310: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a340: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a350: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a360: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a370: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a380: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a3b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3d0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3f0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a400: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a410: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a420: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a430: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a440: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a450: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a480: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a490: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a4a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4d0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4f0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a500: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a510: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a520: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a530: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a540: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a550: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a560: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a570: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a580: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a590: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a5a0: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a5b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5c0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5d0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5e0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5f0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a600: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a610: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a620: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a630: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a640: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a650: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a660: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a680: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a690: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a6b0: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6c0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6d0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6e0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6f0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a700: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a710: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a720: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a730: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a740: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a760: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a770: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a780: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a790: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a7a0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a7b0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7c0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7e0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7f0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a800: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a820: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a830: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a840: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a850: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a860: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a870: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a880: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a890: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a8a0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a8b0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8c0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a900: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a910: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a920: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a930: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a940: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a950: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a960: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a970: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a980: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a990: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9a0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a9b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9e0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9f0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
aa00: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
aa10: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa20: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa30: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa50: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa60: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa70: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa80: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa90: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aaa0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aab0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aac0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aae0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aaf0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ab00: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
ab10: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab20: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab30: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab40: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab70: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aba0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
abb0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
abc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abd0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abe0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abf0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
ac00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
ac10: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac20: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac30: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac40: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac50: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac60: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac70: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac80: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac90: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
aca0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
acb0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
acc0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acd0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ace0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acf0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ad00: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ad10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad20: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad30: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad40: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad50: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad60: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad70: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ada0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
adb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
adc0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
add0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
ade0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
adf0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ae00: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
ae10: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae20: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae30: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae40: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae50: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae60: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae70: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae80: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae90: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
aea0: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
aeb0: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aec0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aed0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
aee0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aef0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
af00: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
af10: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
af20: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
af30: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
af40: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
af50: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
af60: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
af70: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
af80: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
af90: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
afa0: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
afb0: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
afc0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
afd0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
afe0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
aff0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
b000: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
b010: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b020: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b030: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b040: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b050: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b060: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b070: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b080: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b090: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b0a0: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b0b0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b0c0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b0d0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b0e0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b0f0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b100: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b110: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b120: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b130: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b140: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b150: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b160: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b170: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b180: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b190: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b1a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b1b0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b1c0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b1d0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b1e0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b1f0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b200: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b210: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b220: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b230: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b240: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b250: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b260: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b270: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b280: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b290: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b2a0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b2b0: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b2c0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b2d0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b2e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b2f0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b300: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b310: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b320: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b330: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b340: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b350: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b360: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b370: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b380: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b390: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b3a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3c0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b3d0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b3e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b400: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b410: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b420: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b430: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b440: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b450: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b460: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b470: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b480: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b490: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b4a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b4b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b4c0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b4d0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b4e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b4f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b500: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b510: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b520: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b530: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b540: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b550: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b560: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b570: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b580: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b590: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b5a0: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b5b0: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b5c0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b5d0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b5e0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b5f0: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b600: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b620: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b630: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b640: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b650: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b660: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b670: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b680: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b690: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b6a0: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b6b0: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6c0: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b6d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b6e0: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b6f0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b700: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b710: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b720: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b730: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b740: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b750: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b760: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b770: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b780: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b790: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b7a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b7b0: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b7c0: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b7d0: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b7e0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b7f0: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b800: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b810: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b820: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b830: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b840: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b850: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b860: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b870: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b880: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b890: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b8a0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b8b0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b8c0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b8d0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b8e0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b8f0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b900: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b910: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b920: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b930: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b940: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b950: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b960: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
b970: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
b980: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
b990: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
b9a0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b9b0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b9c0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b9d0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b9e0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b9f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ba00: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
ba10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ba20: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ba30: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
ba40: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
ba50: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
ba60: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
ba70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ba80: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ba90: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
baa0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
bab0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
bac0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bad0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bae0: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
baf0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bb00: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
bb10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bb40: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bb50: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bb60: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bb70: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bb80: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bb90: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bba0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bbb0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bbc0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bbd0: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bbe0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bbf0: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bc00: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bc10: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bc20: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bc30: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bc40: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bc50: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bc60: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bc70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bc80: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bc90: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bca0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bcb0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bcc0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bcd0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bce0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bcf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd00: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bd10: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bd20: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bd30: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bd40: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bd50: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bd60: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
bd70: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
bd80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bd90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
bda0: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
bdb0: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
bdc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdd0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
bde0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
bdf0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
be00: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
be10: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
be20: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
be30: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
be40: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
be50: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
be60: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
be70: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
be80: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
be90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
bea0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
beb0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bec0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
bed0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bee0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bef0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bf00: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bf10: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bf20: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bf30: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bf40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bf50: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bf60: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
bf70: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bf80: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bf90: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bfa0: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bfb0: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
bfc0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
bfd0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
bfe0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
bff0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
c000: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
c010: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c020: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c030: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c040: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c050: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c060: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c070: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c080: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c090: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c0a0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c0b0: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c0c0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c0d0: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c0e0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c0f0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c100: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c110: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c120: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c130: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c140: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c150: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c160: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c170: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c180: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c190: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c1a0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c1b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c1c0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c1d0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c1e0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c1f0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c200: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c210: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c220: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c230: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c240: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c250: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c260: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c270: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c280: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c290: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c2a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c2b0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c2c0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c2d0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c2e0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c2f0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c300: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c310: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c320: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c330: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c340: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c350: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c360: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c370: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c380: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c390: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c3a0: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c3b0: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c3c0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c3d0: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c3e0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c3f0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c400: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c410: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c420: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c430: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c440: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c450: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c460: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c470: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c480: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c490: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c4a0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c4b0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c4c0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c4d0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c4e0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c4f0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c500: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c510: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c520: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c530: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c540: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c550: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c560: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c570: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c580: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c590: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c5a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c5b0: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c5c0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c5d0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c5e0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c5f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c600: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c610: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c620: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c630: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c640: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c650: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c660: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c670: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c680: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c690: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c6a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c6b0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c6c0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c6d0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c6e0: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c6f0: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c700: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c710: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c720: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c730: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c740: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c750: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c760: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c770: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c780: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c790: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c7a0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c7b0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c7c0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c7d0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c7e0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c7f0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c800: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c810: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c820: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c830: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c840: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c850: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c860: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c870: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c880: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c890: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c8a0: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c8b0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c8c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c8d0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c8f0: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c900: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c910: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c920: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c930: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c940: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c950: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c960: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
c970: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
c980: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
c990: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
c9a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c9b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c9c0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c9d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c9e0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
c9f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
ca00: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
ca10: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
ca20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
ca30: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
ca40: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
ca50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ca70: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
ca80: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
ca90: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
caa0: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
cab0: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
cac0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cad0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6c  pPager->fd);.#el
cae0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
caf0: 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a 23  METER(pPager);.#
cb00: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
cb10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
cb20: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
cb30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
cb40: 69 7a 65 3e 30 20 26 26 20 28 64 63 26 53 51 4c  ize>0 && (dc&SQL
cb50: 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f  ITE_IOCAP_BATCH_
cb60: 41 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20 20 72  ATOMIC) ){.    r
cb70: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
cb80: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
cb90: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
cba0: 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20 20  C_WRITE.  {.    
cbb0: 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70 50  int nSector = pP
cbc0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
cbd0: 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
cbe0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
cbf0: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
cc00: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
cc10: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
cc20: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
cc30: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
cc40: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
cc50: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
cc60: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
cc70: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
cc80: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
cc90: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
cca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
ccb0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
ccc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ccd0: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
cce0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 23  PG_SZ(pPager);.#
ccf0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
cd00: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  0;.}../*.** If S
cd10: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cd20: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
cd30: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
cd40: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
cd50: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
cd60: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
cd70: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
cd80: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
cd90: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
cda0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
cdb0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cdc0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
cdd0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
cde0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
cdf0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
ce00: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
ce10: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
ce20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ce30: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
ce40: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
ce50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
ce60: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
ce70: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
ce80: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
ce90: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
cea0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
ceb0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
cec0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
ced0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
cee0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
cef0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
cf00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
cf10: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
cf20: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
cf30: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
cf40: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
cf50: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
cf60: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cf70: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cf80: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
cf90: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
cfa0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
cfb0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
cfc0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
cfd0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
cfe0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
cff0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
d000: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
d010: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
d020: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
d030: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
d040: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
d050: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
d060: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
d070: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
d080: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
d090: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
d0a0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
d0b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
d0c0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
d0d0: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
d0e0: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
d0f0: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
d100: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
d110: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
d120: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
d130: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
d140: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
d150: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
d160: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
d170: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
d180: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
d190: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
d1a0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
d1b0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
d1c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
d1d0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
d1e0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
d1f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d200: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
d210: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
d220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d230: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
d240: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
d250: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
d260: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
d270: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
d280: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
d290: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
d2a0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
d2b0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
d2c0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
d2d0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
d2e0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
d2f0: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
d300: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
d310: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d320: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
d330: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
d340: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
d350: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
d360: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
d370: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
d380: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
d390: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
d3a0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
d3b0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
d3c0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
d3d0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
d3e0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
d3f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d400: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
d410: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d420: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
d430: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
d440: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
d450: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
d460: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
d470: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
d480: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
d490: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d4a0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
d4b0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
d4c0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
d4d0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d4e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d4f0: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
d500: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
d510: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
d520: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
d530: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d540: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
d550: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
d560: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
d570: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
d580: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
d590: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
d5a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
d5b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
d5c0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
d5d0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d5e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d5f0: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
d600: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
d610: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
d620: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d630: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d640: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
d650: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d660: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
d670: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
d680: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d690: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
d6a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
d6b0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
d6c0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
d6d0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
d6e0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d700: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d710: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
d720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
d730: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
d740: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d750: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
d760: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
d770: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
d780: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
d790: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
d7a0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
d7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d7c0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
d7d0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
d7e0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d7f0: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d800: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
d810: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
d820: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d830: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
d840: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
d850: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
d860: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
d870: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
d880: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
d890: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d8a0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
d8b0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
d8c0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
d8d0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d8e0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d8f0: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
d900: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
d910: 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d 31 36     || len>szJ-16
d920: 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20  .   || len==0 . 
d930: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d940: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
d950: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
d960: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
d970: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d980: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
d990: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
d9a0: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
d9b0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
d9c0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
d9d0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d9e0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
d9f0: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
da00: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
da10: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
da20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
da30: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
da40: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
da50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
da60: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
da70: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
da80: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
da90: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
daa0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
dab0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
dac0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
dad0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
dae0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
daf0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
db00: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
db10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
db20: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
db30: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
db40: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
db50: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
db60: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
db70: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
db80: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
db90: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
dba0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
dbb0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
dbc0: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
dbd0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
dbe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
dc00: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
dc10: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
dc20: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
dc30: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
dc40: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
dc50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dc60: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
dc70: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
dc80: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
dc90: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
dca0: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
dcb0: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
dcc0: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
dcd0: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
dce0: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
dcf0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
dd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
dd20: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
dd40: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
dd60: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
ddb0: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
ddc0: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
ddd0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
dde0: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
ddf0: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
de00: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
de10: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
de20: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
de30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
de40: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
de50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
de60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
de70: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
de80: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
de90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
dea0: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
deb0: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
dec0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ded0: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
dee0: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
def0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
df00: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
df10: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
df20: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
df30: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
df40: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
df50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
df60: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
df70: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
df80: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
df90: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
dfa0: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
dfb0: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
dfc0: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
dfd0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
dfe0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
dff0: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
e000: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
e010: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e030: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
e040: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
e050: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
e060: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
e070: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
e080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e090: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
e0a0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
e0b0: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
e0c0: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
e0d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
e0e0: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
e0f0: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
e100: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
e110: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
e120: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
e130: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
e140: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
e150: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
e160: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
e170: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
e180: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
e190: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
e1a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
e1b0: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
e1c0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
e1d0: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
e1e0: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
e1f0: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
e200: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
e210: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
e220: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
e230: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
e240: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
e250: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
e260: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
e270: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
e280: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
e290: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
e2a0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
e2b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
e2c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
e2d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
e2e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
e2f0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
e300: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
e310: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e340: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
e350: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e360: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
e370: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
e380: 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
e390: 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
e3a0: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
e3b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
e3c0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
e3d0: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
e3e0: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
e3f0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
e400: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
e410: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
e420: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
e430: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
e440: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
e450: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
e460: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e470: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e480: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
e490: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
e4a0: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
e4b0: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
e4c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e4d0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
e4e0: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
e4f0: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
e500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e510: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e520: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
e530: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
e540: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
e550: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
e560: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
e570: 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
e580: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
e590: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
e5a0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
e5b0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
e5c0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
e5d0: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
e5e0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
e5f0: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
e600: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
e610: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
e620: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
e630: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
e640: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
e650: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
e660: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
e670: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
e680: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
e690: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
e6a0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
e6b0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
e6c0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
e6d0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
e6e0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
e6f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e700: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
e710: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
e720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e730: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
e740: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
e750: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e760: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
e770: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
e780: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
e790: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
e7a0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
e7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
e7c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e7d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e7e0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e7f0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
e800: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
e810: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
e820: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
e830: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
e840: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e850: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
e860: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
e870: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
e880: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
e890: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
e8a0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
e8b0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
e8c0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
e8d0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
e8e0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
e8f0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
e900: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
e910: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
e920: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
e930: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
e940: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
e950: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
e960: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
e970: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
e980: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
e990: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
e9a0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
e9b0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
e9c0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
e9d0: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
e9e0: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
e9f0: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
ea00: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
ea10: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
ea20: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
ea30: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
ea40: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
ea50: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
ea60: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
ea70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ea80: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
ea90: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
eaa0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
eab0: 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  ;  /* Temporary 
eac0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75  space used to bu
ead0: 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ild header */.  
eae0: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75  u32 nHeader = (u
eaf0: 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
eb00: 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62  ize;/* Size of b
eb10: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
eb20: 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20   by zHeader */. 
eb30: 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20   u32 nWrite;    
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
eb60: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77   header sector w
eb70: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
eb80: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
ebb0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
ebc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
ebd0: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
ebe0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
ebf0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66  e open. */..  if
ec00: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
ec10: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ec20: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
ec30: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
ec40: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
ec50: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
ec60: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
ec70: 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68  ts and any of th
ec80: 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20  em were created 
ec90: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
eca0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
ecb0: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
ecc0: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
ecd0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61  he .  ** PagerSa
ece0: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
ecf0: 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  et fields now.. 
ed00: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
ed10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ed20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ed30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
ed40: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
ed50: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
ed60: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
ed70: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
ed80: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
ed90: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
eda0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
edb0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
edc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edd0: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
ede0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
edf0: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
ee00: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
ee10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ee20: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
ee30: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
ee40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ee50: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
ee60: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
ee70: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
ee80: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
ee90: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
eea0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
eeb0: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
eec0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
eed0: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
eee0: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
eef0: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
ef00: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
ef10: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
ef20: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
ef30: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
ef40: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
ef50: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
ef60: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
ef70: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
ef80: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
ef90: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
efa0: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
efb0: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
efc0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
efd0: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
efe0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
eff0: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
f000: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
f010: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
f020: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
f030: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
f040: 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77  ccurred whilst w
f050: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
f060: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
f070: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
f080: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
f090: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
f0a0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
f0b0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
f0c0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
f0d0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
f0e0: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
f0f0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
f100: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
f110: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
f120: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
f130: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
f140: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
f150: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
f160: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
f170: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
f180: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
f190: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
f1a0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
f1b0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
f1c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f1d0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
f1e0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f1f0: 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
f200: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20  noSync );.  if( 
f210: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
f220: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
f230: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
f240: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
f250: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
f260: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
f270: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
f280: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
f290: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
f2a0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
f2b0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
f2c0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
f2d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
f2e0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
f2f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f300: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
f310: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
f320: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  se{.    memset(z
f330: 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Header, 0, sizeo
f340: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f350: 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  +4);.  }..  /* T
f360: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
f370: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72  hash initializer
f380: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
f390: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
f3a0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
f3b0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
f3c0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
f3d0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f3e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f3f0: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
f400: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
f410: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
f420: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
f430: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f440: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f450: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
f460: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
f470: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
f480: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
f490: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
f4a0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f4b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f4c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f4d0: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
f4e0: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
f4f0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
f500: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f510: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f520: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
f530: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f540: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
f550: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
f560: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
f570: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
f580: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
f590: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
f5a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
f5b0: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
f5c0: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
f5d0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
f5e0: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
f5f0: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
f600: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
f610: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
f620: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
f630: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
f640: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
f650: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
f660: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
f670: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
f680: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
f690: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
f6a0: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
f6b0: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
f6c0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
f6d0: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
f6e0: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
f6f0: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
f700: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
f710: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
f720: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
f730: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
f740: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
f750: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
f760: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
f770: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
f780: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
f790: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
f7a0: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
f7b0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
f7c0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
f7d0: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
f7e0: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
f7f0: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
f800: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
f810: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
f820: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
f830: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
f840: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
f850: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
f860: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
f870: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
f880: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
f890: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
f8a0: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
f8b0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
f8c0: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
f8d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
f8e0: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
f8f0: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
f900: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
f910: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
f920: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
f930: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
f940: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
f950: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
f960: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
f970: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
f980: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
f990: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
f9a0: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
f9b0: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
f9c0: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
f9d0: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
f9e0: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
f9f0: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
fa00: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
fa10: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
fa20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
fa30: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
fa40: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
fa50: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
fa60: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
fa70: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
fa80: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
fa90: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
faa0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
fab0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
fac0: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
fad0: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
fae0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
faf0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
fb00: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
fb10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
fb20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fb30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
fb40: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
fb50: 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
fb60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
fb70: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
fb80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fb90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
fba0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
fbb0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
fbc0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
fbd0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
fbe0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
fbf0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
fc00: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
fc10: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
fc20: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
fc30: 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  le. The current 
fc40: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
fc50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
fc60: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67  given by.** pPag
fc70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20  er->journalOff. 
fc80: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
fc90: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
fca0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
fcb0: 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69  r.** a descripti
fcc0: 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
fcd0: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
fce0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
fcf0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
fd00: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65  cessfully, *pNRe
fd10: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
fd20: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
fd30: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
fd40: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
fd50: 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20  and *pDbSize is 
fd60: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
fd70: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
fd80: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
fd90: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
fda0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
fdb0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
fdc0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
fdd0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
fde0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
fdf0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
fe00: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
fe10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
fe20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
fe30: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
fe40: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
fe50: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
fe60: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
fe70: 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61  ned and *pNRec a
fe80: 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20  nd *PDbSize are 
fe90: 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a  undefined.  If J
fea0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
feb0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
fec0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
fed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
fee0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
fef0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ff00: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
ff10: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
ff20: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
ff30: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
ff40: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48  ect */.  int isH
ff50: 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  ot,.  i64 journa
ff60: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
ff70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
ff80: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
ff90: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
ffa0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ffc0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
ffd0: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
ffe0: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
fff0: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
10000 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
10010 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
10020 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
10030 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
10040 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10060 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
10070 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
10080 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
10090 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
100a0 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
100b0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
100c0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
100d0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
100e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
100f0 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
10100 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
10110 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
10120 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
10130 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
10140 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
10150 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
10160 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
10170 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
10180 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
10190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
101a0 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
101b0 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
101c0 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
101d0 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
101e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
101f0 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
10200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
10210 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
10220 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
10230 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10240 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
10250 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
10260 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
10270 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10280 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
10290 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
102a0 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
102b0 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
102c0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
102d0 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
102e0 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
102f0 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
10300 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
10310 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
10320 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
10330 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
10340 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
10350 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
10360 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
10370 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
10380 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
10390 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
103a0 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d  Hot || iHdrOff!=
103b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
103c0 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  dr ){.    rc = s
103d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
103e0 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
103f0 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
10400 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20  , iHdrOff);.    
10410 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10430 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
10440 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
10450 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
10460 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
10470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10480 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
10490 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
104a0 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
104b0 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
104c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
104d0 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
104e0 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
104f0 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
10500 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
10510 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
10520 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
10530 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
10540 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
10550 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
10560 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
10570 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
10580 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
10590 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
105a0 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
105b0 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
105c0 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
105d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
105e0 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
105f0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
10600 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
10610 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10620 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10630 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
10640 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
10650 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
10660 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
10670 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
10680 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106a0 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
106b0 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
106c0 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
106d0 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
106e0 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
106f0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
10700 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
10710 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
10720 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10730 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
10740 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
10750 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
10760 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10770 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10780 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
10790 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
107a0 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
107b0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
107c0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
107d0 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
107e0 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
107f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10800 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
10810 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   Versions of SQL
10820 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35  ite prior to 3.5
10830 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d  .8 set the page-
10840 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
10850 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
10860 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e   header to zero.
10870 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
10880 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50  ssume that the P
10890 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
108a0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
108b0 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
108c0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
108d0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
108e0 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d    if( iPageSize=
108f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67  =0 ){.      iPag
10900 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
10910 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10920 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
10930 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
10940 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
10950 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10960 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20  -size fields.   
10970 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72   ** are within r
10980 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20  ange. To be 'in 
10990 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c  range', both val
109a0 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61  ues need to be a
109b0 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66   power.    ** of
109c0 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
109d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31  n or equal to 51
109e0 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74  2 or 32, and not
109f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
10a00 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70  eir .    ** resp
10a10 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74  ective compile t
10a20 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69  ime maximum limi
10a30 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
10a40 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32  f( iPageSize<512
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65    || iSectorSize
10a70 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  <32.     || iPag
10a80 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
10a90 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
10aa0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
10ab0 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
10ac0 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
10ad0 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
10ae0 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
10af0 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
10b00 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
10b10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
10b20 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
10b30 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
10b40 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
10b50 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
10b60 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
10b70 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
10b80 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
10b90 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
10ba0 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
10bb0 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
10bc0 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
10bd0 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
10be0 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
10bf0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
10c00 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
10c10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10c30 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
10c40 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
10c50 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
10c60 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
10c70 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
10c80 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
10c90 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
10ca0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
10cb0 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
10cc0 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
10cd0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10ce0 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
10cf0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10d00 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10d10 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
10d20 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20  PageSize, -1);. 
10d30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
10d50 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10d60 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
10d70 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
10d80 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
10d90 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  .    ** the proc
10da0 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
10db0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
10dc0 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
10dd0 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  as.    ** create
10de0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
10df0 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
10e00 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
10e10 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20  utine.    ** is 
10e20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
10e30 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
10e40 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
10e50 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a  ocal value.    *
10e60 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
10e70 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
10e80 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
10e90 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
10ea0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
10eb0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53  >sectorSize = iS
10ec0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a  ectorSize;.  }..
10ed0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10ee0 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
10ef0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
10f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10f10 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
10f20 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
10f30 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10f40 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
10f50 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
10f60 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
10f70 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
10f80 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10f90 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
10fa0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
10fb0 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
10fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10fd0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10fe0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10ff0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
11000 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11010 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
11020 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
11030 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
11040 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
11050 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
11060 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  t is:.**.**   + 
11070 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
11080 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e  J_PGNO..**   + N
11090 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
110a0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
110b0 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b  in utf-8..**   +
110c0 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e   4 bytes: N (len
110d0 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
110e0 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79  urnal name in by
110f0 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d  tes, no nul-term
11100 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20  inator)..**   + 
11110 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
11120 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
11130 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20  cksum..**   + 8 
11140 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
11150 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
11160 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11170 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
11180 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
11190 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
111a0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
111b0 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68  name, where each
111c0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
111d0 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64  eted as a signed
111e0 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a   8-bit integer..
111f0 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
11200 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
11210 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
11220 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
11230 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
11240 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
11250 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
11260 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
11270 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
11280 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
11290 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
112a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
112d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
112e0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
112f0 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
11300 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
11310 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
11320 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
11330 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
11340 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20  et of header in 
11350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
11360 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20    i64 jrnlSize; 
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
11390 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69  urnal file on di
113a0 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  sk */.  u32 cksu
113b0 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
113c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
113d0 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a  ksum of string z
113e0 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  Master */..  ass
113f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
11400 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61  Master==0 );.  a
11410 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
11420 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
11430 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a    if( !zMaster .
11440 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
11450 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
11460 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
11470 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70  ORY .   || !isOp
11480 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a  en(pPager->jfd).
11490 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
114a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
114b0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
114c0 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
114d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
114e0 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
114f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
11500 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
11510 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
11520 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
11530 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
11540 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
11550 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
11560 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
11570 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
11580 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
11590 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
115a0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
115b0 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
115c0 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
115d0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
115e0 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
115f0 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
11600 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
11610 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
11620 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
11630 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
11640 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
11650 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
11660 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
11670 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
11680 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
11690 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
116a0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
116b0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
116c0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
116d0 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
116e0 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
116f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
11700 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
11710 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
11720 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
11730 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
11740 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
11750 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
11760 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
11770 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
11780 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
11790 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
117a0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
117b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
117c0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
117d0 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
117e0 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
117f0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11800 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11810 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11820 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
11830 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11840 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
11850 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11860 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
11870 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
11880 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
11890 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
118a0 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
118b0 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20  alMagic, 8,.    
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64               iHd
118e0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
118f0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
11900 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
11910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11920 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
11930 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
11940 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
11950 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
11960 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
11970 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
11980 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
11990 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
119a0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
119b0 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
119c0 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
119d0 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
119e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
119f0 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
11a00 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
11a10 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
11a20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
11a30 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
11a40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
11a50 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
11a60 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11a70 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
11a80 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
11a90 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
11aa0 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
11ab0 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
11ac0 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
11ad0 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
11ae0 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
11af0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
11b00 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
11b10 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
11b20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11b30 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11b40 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11b50 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
11b60 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
11b70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
11b80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11b90 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
11ba0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
11bb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
11bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11be0 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
11bf0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
11c00 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
11c10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11c20 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11c30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11c40 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11c50 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  sion++;.  sqlite
11c60 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
11c70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
11c80 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
11c90 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
11ca0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
11cb0 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67   Return the pPag
11cc0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
11cd0 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71   value.*/.u32 sq
11ce0 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65  lite3PagerDataVe
11cf0 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  rsion(Pager *pPa
11d00 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
11d10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
11d20 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72  AGER_OPEN );.  r
11d30 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44  eturn pPager->iD
11d40 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  ataVersion;.}../
11d50 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
11d60 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
11d70 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11d80 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
11d90 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
11da0 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
11db0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
11dc0 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
11dd0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
11de0 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
11df0 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
11e00 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11e10 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
11e20 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
11e30 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
11e40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
11e50 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11e60 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
11e70 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11e80 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
11e90 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
11ea0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
11eb0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
11ed0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11ee0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11ef0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
11f00 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
11f10 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11f20 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   || sqlite3Journ
11f30 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
11f40 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11f50 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11f60 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11f70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11f80 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11f90 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11fa0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11fb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11fc0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11fd0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11fe0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11ff0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
12000 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
12010 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
12020 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
12030 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
12040 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
12050 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
12060 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
12070 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
12080 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
12090 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
120a0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
120b0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
120c0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
120d0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
120e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
120f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
12100 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
12110 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
12120 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
12130 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
12140 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
12150 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
12160 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
12170 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
12180 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
12190 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
121a0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
121b0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
121c0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
121d0 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
121e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
121f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
12200 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12220 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
12230 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
12240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12260 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
12270 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
12280 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12290 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
122a0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
122b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
122c0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
122d0 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
122e0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
122f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
12300 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
12310 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
12320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12330 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
12340 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
12350 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
12360 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
12370 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
12380 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
12390 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
123a0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
123b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
123c0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
123d0 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
123e0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
123f0 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
12400 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
12410 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
12420 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
12430 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
12440 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
12450 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
12460 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
12470 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
12480 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
12490 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
124a0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
124b0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
124c0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
124d0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
124e0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
124f0 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
12500 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
12510 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
12520 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
12530 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
12540 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
12550 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
12560 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
12570 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12580 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
12590 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
125a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
125b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
125c0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
125d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
125e0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
125f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
12600 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12610 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
12620 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
12630 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
12640 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
12650 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
12660 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
12670 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
12680 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
12690 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
126a0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
126b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
126c0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
126d0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
126e0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
126f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12700 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12710 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
12720 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
12730 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
12740 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
12750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
12760 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
12770 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
12780 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
12790 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
127a0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
127b0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
127c0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
127d0 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
127e0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
127f0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
12800 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
12810 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
12820 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
12830 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
12840 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
12850 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
12860 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
12870 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
12880 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
12890 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
128a0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
128b0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
128c0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
128d0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
128e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
128f0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12900 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12910 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12920 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
12930 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12940 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12950 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
12960 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12970 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12980 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
12990 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
129a0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
129b0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
129c0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
129d0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
129e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
129f0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12a00 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12a10 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
12a20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
12a30 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12a40 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12a50 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12a60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12a70 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12a80 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12a90 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12aa0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12ab0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12ac0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12ad0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12ae0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12af0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12b00 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12b10 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
12b20 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
12b30 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12b40 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12b50 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12b60 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
12b70 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12b80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12b90 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12ba0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12bb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12bc0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12bd0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12be0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12bf0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12c00 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12c10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12c20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12c30 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12c40 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12c50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12c60 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12c70 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12c80 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12c90 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12ca0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12cb0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12cc0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12cd0 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12ce0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12cf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12d00 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12d10 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12d20 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12d30 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12d40 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12d50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12d60 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12d70 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12d80 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12d90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12da0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12db0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12dc0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12dd0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12de0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12df0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12e00 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12e10 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12e20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12e30 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12e40 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12e50 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12e60 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12e70 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12e80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12ea0 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
12eb0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12ec0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
12ed0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  ->tempFile==0 ){
12ee0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
12ef0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12f00 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
12f10 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
12f20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
12f30 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12f40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12f50 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12f60 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67  e = (isOpen(pPag
12f70 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52  er->jfd) ? PAGER
12f80 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45  _OPEN : PAGER_RE
12f90 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ADER);.    }.   
12fa0 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
12fb0 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
12fc0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
12fd0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
12fe0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12ff0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13000 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
13010 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
13020 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13030 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
13040 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
13050 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
13060 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f  Master = 0;.}../
13070 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13080 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
13090 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f  never an IOERR o
130a0 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61  r FULL error tha
130b0 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68  t requires.** th
130c0 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73  e pager to trans
130d0 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45  ition into the E
130e0 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61  RROR state may a
130f0 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  hve occurred..**
13100 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
13110 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
13120 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
13130 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
13140 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ond .** the erro
13150 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
13160 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
13170 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
13180 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c  ion. The .** val
13190 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
131a0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
131b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
131c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
131d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
131e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
131f0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c  SQLITE_FULL, SQL
13200 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65  ITE_IOERR or one
13210 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52   of the.** IOERR
13220 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20   sub-codes, the 
13230 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
13240 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
13250 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
13260 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
13270 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57  Pager.errCode. W
13280 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72  hile the pager r
13290 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52  emains in the ER
132a0 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c  ROR state,.** al
132b0 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c  l major API call
132c0 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77  s on the Pager w
132d0 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
132e0 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72  return Pager.err
132f0 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Code..**.** The 
13300 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69  ERROR state indi
13310 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
13320 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
13330 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
13340 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
13350 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
13360 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
13370 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
13380 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
13390 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
133a0 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
133b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
133c0 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
133d0 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
133e0 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
133f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
13400 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
13410 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
13420 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
13430 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
13440 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
13450 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
13460 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
13470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13480 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
13490 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
134a0 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
134b0 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
134c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
134d0 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
134e0 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
134f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
13500 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
13510 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
13520 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
13530 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
13540 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
13550 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
13560 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  RR.  );.  if( rc
13570 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
13580 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f  | rc2==SQLITE_IO
13590 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ERR ){.    pPage
135a0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
135b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
135c0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f  ate = PAGER_ERRO
135d0 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65 72  R;.    setGetter
135e0 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a  Method(pPager);.
135f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13600 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
13610 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
13620 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
13630 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a  o nPage);../*.**
13640 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e 73   The write trans
13650 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70  action open on p
13660 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20 63  Pager is being c
13670 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69  ommitted (bCommi
13680 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  t==1).** or roll
13690 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74  ed back (bCommit
136a0 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ==0)..**.** Retu
136b0 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f  rn TRUE if and o
136c0 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79  nly if all dirty
136d0 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65   pages should be
136e0 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b   flushed to disk
136f0 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a  ..**.** Rules:.*
13700 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f  *.**   *  For no
13710 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65 73  n-TEMP databases
13720 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f  , always sync to
13730 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20   disk.  This is 
13740 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20  necessary.**    
13750 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f    for transactio
13760 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65  ns to be durable
13770 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e  ..**.**   *  Syn
13780 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  c TEMP database 
13790 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54  only on a COMMIT
137a0 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b   (not a ROLLBACK
137b0 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69  ) when the backi
137c0 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20  ng.**      file 
137d0 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
137e0 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61 20   already (via a 
137f0 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74  spill on pagerSt
13800 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20  ress()) and.**  
13810 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d      when the num
13820 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61 67  ber of dirty pag
13830 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63  es in memory exc
13840 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65 20  eeds 25% of the 
13850 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61  total.**      ca
13860 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  che size..*/.sta
13870 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75  tic int pagerFlu
13880 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72  shOnCommit(Pager
13890 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43   *pPager, int bC
138a0 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50  ommit){.  if( pP
138b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
138c0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
138d0 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72  if( !bCommit ) r
138e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
138f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
13900 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
13910 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
13920 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69 72  PCachePercentDir
13930 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
13940 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a  he)>=25);.}../*.
13950 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13960 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
13970 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
13980 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
13990 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
139a0 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
139b0 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
139c0 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
139d0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
139e0 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
139f0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
13a00 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
13a10 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
13a20 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
13a30 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
13a40 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
13a50 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
13a60 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
13a70 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
13a80 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
13a90 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
13aa0 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
13ab0 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
13ac0 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
13ad0 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
13ae0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
13af0 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
13b00 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
13b10 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
13b20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
13b30 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
13b40 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
13b50 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
13b60 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
13b70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
13b80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13b90 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
13ba0 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
13bb0 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
13bc0 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
13bd0 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
13be0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
13bf0 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
13c00 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
13c10 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
13c20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
13c30 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
13c40 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
13c50 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
13c60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13c70 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
13c80 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13c90 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
13ca0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13cb0 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
13cc0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13cd0 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
13ce0 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
13cf0 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
13d00 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
13d10 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
13d20 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13d30 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
13d40 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
13d50 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
13d60 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
13d70 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
13d80 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
13d90 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
13da0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
13db0 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
13dc0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
13dd0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
13de0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
13df0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13e00 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
13e10 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
13e20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
13e30 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
13e40 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
13e50 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
13e60 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
13e70 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
13e80 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
13e90 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
13ea0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
13eb0 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
13ec0 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
13ed0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
13ee0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13ef0 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
13f00 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13f10 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
13f20 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
13f30 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
13f40 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
13f50 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
13f60 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
13f70 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
13f80 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
13f90 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
13fa0 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
13fb0 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
13fc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
13fd0 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
13fe0 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
13ff0 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
14000 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
14010 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
14020 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
14030 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
14040 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
14050 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
14060 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
14070 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
14080 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
14090 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
140a0 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
140b0 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
140c0 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
140d0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
140e0 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
140f0 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
14100 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
14110 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
14120 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
14130 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
14140 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
14150 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
14160 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
14170 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
14180 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
14190 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
141a0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
141b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
141c0 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
141d0 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
141e0 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
141f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14200 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
14210 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
14220 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
14230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14240 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
14250 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
14260 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
14270 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
14280 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
14290 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
142a0 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
142b0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
142c0 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
142d0 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
142e0 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
142f0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
14300 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
14310 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
14320 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
14330 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62  hasMaster, int b
14340 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72  Commit){.  int r
14350 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14360 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
14370 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
14380 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
14390 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
143a0 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
143b0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
143c0 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
143d0 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
143e0 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
143f0 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
14400 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
14410 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
14420 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
14430 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
14440 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
14450 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
14460 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
14470 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
14480 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
14490 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
144a0 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
144b0 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
144c0 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
144d0 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
144e0 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
144f0 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
14500 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
14510 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
14520 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
14530 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
14540 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
14550 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
14560 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
14570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
14580 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
14590 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
145a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
145b0 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
145c0 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
145d0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
145e0 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
145f0 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
14600 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
14610 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
14620 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
14630 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14640 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
14650 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
14660 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
14670 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
14680 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
14690 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
146a0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
146b0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
146c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
146d0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
146e0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
146f0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
14700 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
14710 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
14720 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
14730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14740 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
14750 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
14760 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
14770 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
14780 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
14790 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
147a0 20 0a 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69   .      || (sqli
147b0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
147c0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
147d0 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
147e0 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
147f0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ).  );.  if( isO
14800 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
14810 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14820 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
14830 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
14840 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
14850 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
14860 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
14870 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14880 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
14890 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
148a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
148b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
148c0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
148d0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
148e0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
148f0 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >jfd);.    }else
14900 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
14910 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14920 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
14930 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
14940 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14950 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
14960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14970 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
14980 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14990 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
149a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
149b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
149c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
149d0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
149e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
149f0 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
14a00 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69  file size is wri
14a10 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
14a20 6f 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a  ode right away..
14a30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68            ** Oth
14a40 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e  erwise the journ
14a50 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65  al might resurre
14a60 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70  ct following a p
14a70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20  ower loss and.  
14a80 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
14a90 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61   the last transa
14aa0 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61  ction to roll ba
14ab0 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20  ck.  See.       
14ac0 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75     ** https://bu
14ad0 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f  gzilla.mozilla.o
14ae0 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f  rg/show_bug.cgi?
14af0 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20  id=1072773.     
14b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14b20 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
14b30 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
14b40 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ags);.        }.
14b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
14b60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14b70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
14b80 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14b90 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14ba0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
14bb0 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ST.      || (pPa
14bc0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14bd0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  de && pPager->jo
14be0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
14bf0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
14c00 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
14c10 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
14c20 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
14c30 73 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65  ster||pPager->te
14c40 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70  mpFile);.      p
14c50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14c60 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
14c70 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
14c80 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
14c90 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
14ca0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
14cb0 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
14cc0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
14cd0 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
14ce0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
14cf0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
14d00 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
14d10 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
14d20 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
14d30 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
14d40 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
14d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14d60 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
14d70 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
14d80 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  mory journal..  
14d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
14da0 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67   bDelete = !pPag
14db0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
14dc0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14dd0 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
14de0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  mory(pPager->jfd
14df0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )==0 );.      as
14e00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
14e10 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14e20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
14e30 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
14e40 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14e50 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14e60 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14e70 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14e80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14e90 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14ea0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
14eb0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14ec0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14ed0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
14ee0 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
14ef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14f00 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14f10 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
14f20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
14f30 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20  ->extraSync);.  
14f40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
14f60 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
14f70 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
14f80 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
14f90 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
14fa0 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
14fb0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
14fc0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
14fd0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
14fe0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
14ff0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
15000 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
15010 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
15020 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
15030 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
15040 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
15050 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
15060 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
15070 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
15080 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
15090 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
150a0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
150b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
150c0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
150d0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
150e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
150f0 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67  if( MEMDB || pag
15100 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28  erFlushOnCommit(
15110 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29  pPager, bCommit)
15120 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15130 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
15140 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
15150 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15160 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15170 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70 50  ClearWritable(pP
15180 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
15190 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
151a0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
151b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
151c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
151d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  ;.  }..  if( pag
151e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
151f0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
15200 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
15210 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
15220 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
15230 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
15240 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
15250 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
15260 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
15270 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
15280 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
15290 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
152a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
152b0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
152c0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
152d0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
152e0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
152f0 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
15300 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
15310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15320 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
15330 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
15340 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
15350 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
15360 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
15370 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
15380 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
15390 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
153a0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
153b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
153c0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
153d0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
153e0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
153f0 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
15400 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
15410 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
15420 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
15430 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
15440 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
15450 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
15460 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
15470 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
15480 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
15490 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
154a0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
154b0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
154c0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
154d0 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
154e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
154f0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
15500 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
15510 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
15520 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
15530 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
15540 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
15550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
15560 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
15570 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
15580 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15590 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
155a0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
155b0 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
155c0 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
155d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
155e0 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
155f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
15600 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
15610 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
15620 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
15630 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
15640 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
15650 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
15660 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
15670 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
15680 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
15690 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
156a0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
156b0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
156c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
156d0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
156e0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
156f0 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
15700 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
15710 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
15720 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
15730 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
15740 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
15750 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
15760 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
15770 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
15780 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
15790 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
157a0 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
157b0 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
157c0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
157d0 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
157e0 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
157f0 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
15800 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
15810 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
15820 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
15830 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
15840 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
15850 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
15860 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
15870 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
15880 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
15890 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
158a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
158b0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
158c0 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
158d0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
158e0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
158f0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
15900 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
15910 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
15920 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
15930 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
15940 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
15950 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
15960 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
15970 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
15980 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
15990 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
159a0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
159b0 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
159c0 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
159d0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
159e0 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
159f0 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
15a00 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
15a10 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
15a20 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
15a30 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
15a40 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
15a50 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
15a60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
15a70 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15a80 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
15a90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
15aa0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
15ab0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
15ac0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
15ad0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
15ae0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
15af0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
15b00 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
15b10 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15b20 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15b30 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
15b40 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15b50 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15b60 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15b70 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
15b80 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
15b90 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
15ba0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
15bb0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
15bc0 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
15bd0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
15be0 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
15bf0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
15c00 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
15c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
15c20 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
15c30 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15c40 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
15c50 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
15c60 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
15c70 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
15c80 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
15c90 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15ca0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
15cb0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
15cc0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
15cd0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
15ce0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15cf0 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15d00 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15d10 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15d20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15d30 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15d40 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15d50 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
15d60 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15d70 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
15d80 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
15d90 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
15da0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
15db0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
15dc0 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
15dd0 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
15de0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15df0 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15e00 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15e10 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15e20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15e30 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15e40 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15e50 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15e60 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15e70 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15e80 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
15e90 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
15ea0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
15eb0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
15ec0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
15ed0 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
15ee0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15ef0 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15f00 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15f10 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15f20 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15f30 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
15f40 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
15f50 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
15f60 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
15f70 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
15f80 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
15f90 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
15fa0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
15fb0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
15fc0 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
15fd0 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
15fe0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15ff0 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
16000 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
16010 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
16020 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
16030 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
16040 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
16050 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
16060 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
16070 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
16080 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
16090 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
160a0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
160b0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
160c0 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
160d0 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
160e0 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
160f0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
16100 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
16110 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
16120 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16130 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
16140 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
16150 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
16160 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
16170 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
16180 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
16190 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
161a0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
161b0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
161c0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
161f0 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
16200 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
16210 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
16220 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
16230 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
16240 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
16250 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
16260 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
16270 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16280 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16290 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
162a0 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
162b0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
162c0 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
162d0 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
162e0 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
162f0 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
16300 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
16310 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
16320 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
16330 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
16340 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
16350 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
16360 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
16370 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
16380 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
16390 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
163a0 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
163b0 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
163c0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
163d0 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
163e0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
163f0 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
16400 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
16410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16420 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
16430 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
16440 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
16450 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
16460 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
16470 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
16480 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
16490 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
164a0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
164b0 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
164c0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
164d0 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
164e0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
164f0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
16500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
16510 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16520 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
16530 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
16540 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
16550 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
16560 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16570 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
16580 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
16590 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
165a0 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
165b0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
165c0 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
165d0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
165e0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
165f0 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
16600 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
16610 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
16620 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
16630 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
16640 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
16650 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
16660 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
16670 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
16680 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
16690 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
166a0 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
166b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
166c0 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
166d0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
166e0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
166f0 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
16700 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
16710 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
16720 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
16730 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
16740 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
16750 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
16760 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
16770 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
16780 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
16790 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
167a0 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
167b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
167c0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
167d0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
167e0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
167f0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
16800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
16810 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
16820 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16830 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
16840 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
16850 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
16860 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
16870 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
16880 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16890 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
168a0 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
168b0 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
168c0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
168d0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
168e0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
168f0 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
16900 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
16910 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
16920 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
16930 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
16940 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
16950 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
16960 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
16970 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
16980 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
16990 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
169a0 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
169b0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
169c0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
169d0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
169e0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
169f0 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
16a00 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
16a10 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
16a20 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
16a30 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
16a40 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
16a50 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
16a60 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
16a70 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
16a80 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
16a90 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
16aa0 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
16ab0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
16ac0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
16ad0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
16ae0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
16af0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
16b00 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16b10 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16b20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
16b30 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
16b40 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
16b50 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
16b60 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
16b70 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
16b80 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
16b90 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
16ba0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
16bb0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
16bc0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
16bd0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
16be0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16bf0 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
16c00 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
16c10 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
16c20 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
16c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16c40 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
16c50 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
16c60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16c70 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c90 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
16ca0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
16cb0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
16ce0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16cf0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16d00 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16d20 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16d30 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
16d40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
16d50 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
16d60 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16d70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
16d80 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
16d90 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
16da0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16db0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16dc0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
16dd0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
16de0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16df0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16e00 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16e10 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69 66  is synced */.#if
16e20 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16e30 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a 72  ODEC.  /* The jr
16e40 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74 72  nlEnc flag is tr
16e50 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70 61  ue if Journal pa
16e60 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 61  ges should be pa
16e70 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  ssed through.  *
16e80 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49 74  * the codec.  It
16e90 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70 75   is false for pu
16ea0 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  re in-memory jou
16eb0 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73  rnals. */.  cons
16ec0 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d 20  t int jrnlEnc = 
16ed0 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70  (isMainJrnl || p
16ee0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
16ef0 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66 0a  ory==0);.#endif.
16f00 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
16f10 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
16f20 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
16f30 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
16f40 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
16f50 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
16f60 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
16f70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
16f80 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
16f90 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
16fa0 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
16fb0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
16fc0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
16fd0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
16fe0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
16ff0 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
17000 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
17010 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
17020 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
17030 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
17040 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
17050 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
17060 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
17070 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
17080 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
17090 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
170a0 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
170b0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
170c0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
170d0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
170e0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
170f0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
17100 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
17110 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
17120 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
17130 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
17140 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
17150 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
17160 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
17170 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
17180 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
17190 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
171a0 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
171b0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
171c0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
171d0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
171e0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
171f0 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
17200 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
17210 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
17220 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
17230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17240 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17250 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
17260 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
17270 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
17280 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
17290 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
172a0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
172b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
172c0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
172d0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
172e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
172f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
17300 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
17310 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
17320 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
17330 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
17340 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
17350 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
17360 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
17370 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
17380 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
17390 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
173a0 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
173b0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
173c0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
173d0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
173e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
173f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
17400 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
17410 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
17420 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17430 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
17440 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17450 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17460 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
17470 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
17480 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
17490 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
174a0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
174b0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
174c0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
174d0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
174e0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
174f0 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
17500 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
17510 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
17520 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
17530 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
17540 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
17550 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
17560 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
17570 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
17580 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
17590 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
175a0 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
175b0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
175c0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
175d0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
175e0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
175f0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
17600 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
17610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17620 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
17630 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
17640 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
17650 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
17660 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
17670 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17690 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
176a0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
176b0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
176c0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
176d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
176e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
176f0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
17700 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
17710 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
17720 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
17730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17740 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
17750 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
17760 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17770 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66   played back bef
17780 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
17790 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
177a0 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
177b0 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
177c0 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
177d0 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
177e0 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
177f0 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
17800 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
17810 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17820 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
17830 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
17840 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
17850 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
17860 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
17870 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
17880 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
17890 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
178a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
178b0 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
178c0 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
178d0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
178e0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
178f0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
17900 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
17910 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
17920 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
17930 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
17940 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
17950 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
17960 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
17970 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
17980 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
17990 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
179a0 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
179b0 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
179c0 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
179d0 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
179e0 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
179f0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
17a00 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
17a10 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
17a20 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
17a30 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
17a40 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
17a50 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
17a60 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
17a70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
17a80 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
17a90 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
17aa0 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
17ab0 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
17ac0 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
17ad0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
17ae0 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
17af0 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
17b00 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
17b10 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
17b20 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
17b30 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
17b40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
17b50 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
17b60 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
17b70 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
17b80 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
17b90 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
17ba0 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
17bb0 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
17bc0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
17bd0 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
17be0 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
17bf0 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
17c00 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
17c10 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
17c20 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
17c30 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
17c40 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
17c50 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
17c60 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
17c70 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17c80 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
17c90 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
17ca0 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
17cb0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
17cc0 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
17cd0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
17ce0 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
17cf0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
17d00 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
17d10 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
17d20 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
17d30 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
17d40 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
17d50 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
17d60 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
17d70 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
17d80 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
17d90 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
17da0 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
17db0 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
17dc0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
17dd0 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
17de0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
17df0 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
17e00 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
17e10 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
17e20 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
17e30 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
17e40 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
17e50 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
17e60 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
17e70 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
17e80 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
17e90 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
17ea0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17eb0 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
17ec0 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
17ed0 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
17ee0 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
17ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
17f00 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
17f10 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
17f20 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
17f30 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
17f40 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
17f50 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
17f60 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
17f70 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
17f80 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
17f90 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
17fa0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
17fb0 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
17fc0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
17fd0 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
17fe0 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
17ff0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
18000 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
18010 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
18020 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
18030 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
18040 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
18050 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
18060 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
18070 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
18080 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
18090 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
180a0 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
180b0 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
180c0 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
180d0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
180e0 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
180f0 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
18100 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
18110 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
18120 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
18130 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
18140 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e{.    pPg = sql
18150 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
18160 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
18170 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
18180 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
18190 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
181a0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
181b0 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20  EN || pPg==0 || 
181c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
181d0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
181e0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
181f0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
18200 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
18210 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
18220 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
18230 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
18240 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
18250 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
18260 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
18270 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
18280 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
18290 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
182a0 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
182b0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
182c0 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
182d0 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
182e0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
182f0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
18300 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
18310 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
18320 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
18330 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
18340 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
18350 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
18360 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
18370 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
18380 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
18390 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
183a0 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
183b0 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
183c0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
183d0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
183e0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
183f0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
18400 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
18410 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
18420 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18430 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
18440 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
18450 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20 72  Write the data r
18460 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
18470 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74  rnal back into t
18480 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18490 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
184a0 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65 76   usually safe ev
184b0 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79 70  en for an encryp
184c0 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20 61  ted database - a
184d0 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  s the data.    *
184e0 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64 20  * was encrypted 
184f0 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77 72  before it was wr
18500 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
18510 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 65  rnal file. The e
18520 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  xception.    ** 
18530 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20 77  is if the data w
18540 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  as just read fro
18550 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  m an in-memory s
18560 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 74  ub-journal. In t
18570 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  hat.    ** case 
18580 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72 79  it must be encry
18590 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72 65  pted here before
185a0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
185b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
185c0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a 2f      ** file.  */
185d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
185e0 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28  AS_CODEC.    if(
185f0 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20   !jrnlEnc ){.   
18600 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
18610 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
18620 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18630 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a  M_BKPT, aData);.
18640 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18650 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
18660 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
18670 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
18680 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
18690 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
186a0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
186b0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
186c0 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c 73  _BKPT);.    }els
186d0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  e.#endif.    rc 
186e0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
186f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
18700 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
18710 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
18720 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  );..    if( pgno
18730 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
18740 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
18750 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
18760 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
18770 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
18780 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66 20  ackup ){.#ifdef 
18790 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
187a0 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45  .      if( jrnlE
187b0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f  nc ){.        CO
187c0 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
187d0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
187e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
187f0 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
18800 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
18810 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
18820 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
18830 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  a);.        CODE
18840 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
18850 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
18860 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
18870 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65  aData);.      }e
18880 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
18890 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
188a0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
188b0 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
188c0 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  )aData);.    }. 
188d0 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
188e0 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
188f0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
18900 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
18910 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
18920 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
18930 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
18940 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18950 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
18960 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
18970 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
18980 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
18990 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
189a0 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
189b0 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
189c0 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
189d0 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
189e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
189f0 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
18a00 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
18a10 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
18a20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18a30 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
18a40 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
18a50 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
18a60 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
18a70 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
18a80 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
18a90 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
18aa0 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
18ab0 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
18ac0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
18ad0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
18ae0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
18af0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18b00 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
18b10 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
18b20 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
18b30 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
18b40 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
18b50 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
18b60 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
18b70 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
18b80 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
18b90 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
18ba0 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
18bb0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
18bc0 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
18bd0 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
18be0 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
18bf0 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
18c00 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
18c10 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
18c20 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
18c30 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
18c40 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
18c50 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
18c60 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
18c70 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
18c80 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
18c90 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
18ca0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30  LAG_ROLLBACK)==0
18cb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
18cc0 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
18cd0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18ce0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18cf0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
18d00 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
18d10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
18d20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18d30 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
18d40 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20  OLLBACK)!=0 );. 
18d50 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
18d60 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46  Spill &= ~SPILLF
18d70 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  LAG_ROLLBACK;.  
18d80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18d90 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18da0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18db0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
18dc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
18dd0 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
18de0 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
18df0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
18e00 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
18e10 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
18e20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
18e30 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
18e40 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
18e50 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
18e60 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
18e70 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
18e80 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
18e90 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
18ea0 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
18eb0 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
18ec0 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
18ed0 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
18ee0 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
18ef0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
18f00 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
18f10 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
18f20 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
18f30 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
18f40 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
18f50 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
18f60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18f70 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
18f80 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
18f90 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  /* It used to be
18fa0 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63 61   that sqlite3Pca
18fb0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
18fc0 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72  ) was called her
18fd0 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74  e.  But.    ** t
18fe0 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e  hat call was dan
18ff0 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e  gerous and had n
19000 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e  o detectable ben
19010 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20 63  efit since the c
19020 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  ache.    ** is n
19030 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20  ormally cleaned 
19040 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
19050 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72  CleanAll() after
19060 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f   rollback and so
19070 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
19080 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20   removed. */.   
19090 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
190a0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
190b0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
190c0 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
190d0 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
190e0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
190f0 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
19100 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
19110 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
19120 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
19130 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
19140 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
19150 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
19160 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
19170 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
19180 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
19190 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
191a0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
191b0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  /.#if SQLITE_HAS
191c0 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 6a  _CODEC.    if( j
191d0 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43 31  rnlEnc ){ CODEC1
191e0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
191f0 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63  pPg->pgno, 3, rc
19200 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
19210 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  PT); }.#endif.  
19220 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
19230 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
19240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19250 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
19260 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
19270 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
19280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
19290 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
192a0 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
192b0 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
192c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
192d0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
192e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
192f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
19300 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
19310 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
19320 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19330 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
19340 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
19350 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
19360 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
19370 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
19380 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
19390 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
193a0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
193b0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
193c0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
193d0 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
193e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
193f0 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
19400 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
19410 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
19420 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
19430 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
19440 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
19450 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
19460 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
19470 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
19480 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
19490 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
194a0 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
194b0 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
194c0 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
194d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
194e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
194f0 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
19500 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
19510 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
19520 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
19530 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
19540 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
19550 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
19560 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
19570 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
19580 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
19590 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
195a0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
195b0 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
195c0 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
195d0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
195e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
195f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
19600 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
19610 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
19620 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
19630 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
19640 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
19650 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
19660 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
19670 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
19680 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
19690 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
196a0 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
196b0 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
196c0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
196d0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
196e0 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
196f0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
19700 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
19710 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
19720 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
19730 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
19740 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
19750 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
19760 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
19770 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
19780 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
19790 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
197a0 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
197b0 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
197c0 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
197d0 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
197e0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
197f0 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
19800 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
19810 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
19820 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
19830 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
19840 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
19850 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
19860 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
19870 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
19880 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
19890 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
198a0 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
198b0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
198c0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
198d0 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
198e0 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
198f0 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
19900 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
19910 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
19920 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
19930 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
19940 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
19950 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
19960 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
19970 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19980 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
19990 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
199a0 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
199b0 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
199c0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
199d0 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
199e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
199f0 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
19a00 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
19a10 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
19a20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19a30 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
19a40 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
19a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19a70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
19a80 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
19a90 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
19aa0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
19ab0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
19ac0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
19ad0 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
19ae0 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
19af0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
19b00 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
19b10 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
19b20 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
19b30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19b40 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
19b50 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
19b60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
19b70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19b80 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
19b90 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
19ba0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
19bb0 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
19bc0 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
19bd0 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
19be0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
19bf0 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
19c00 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
19c10 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
19c20 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
19c30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
19c40 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
19c50 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
19c60 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
19c70 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
19c80 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
19c90 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
19ca0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
19cb0 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
19cc0 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
19cd0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19ce0 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
19cf0 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
19d00 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
19d10 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
19d20 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
19d30 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
19d40 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
19d50 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
19d60 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
19d70 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
19d80 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
19d90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19da0 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
19db0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
19dc0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
19dd0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
19de0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
19df0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
19e00 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19e10 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
19e20 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
19e30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
19e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19e50 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19e60 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
19e70 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
19e80 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
19e90 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
19ea0 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  rom.  ** sqlite3
19eb0 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
19ec0 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
19ed0 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c  terJournal.   Al
19ee0 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73  so obtain.  ** s
19ef0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
19f00 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20  (in zMasterPtr) 
19f10 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
19f20 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a  s of master.  **
19f30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65   journal files e
19f40 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
19f50 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a  gular rollback-j
19f60 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
19f70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
19f80 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
19f90 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
19fa0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19fb0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19fc0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d  master_out;.  nM
19fd0 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
19fe0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
19ff0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
1a000 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1a010 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
1a020 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
1a030 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
1a040 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
1a050 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a060 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
1a070 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a080 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20   }.  zMasterPtr 
1a090 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
1a0a0 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
1a0b0 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  +1];.  rc = sqli
1a0c0 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
1a0d0 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
1a0e0 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
1a0f0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66  ournal, 0);.  if
1a100 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a110 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
1a120 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  _out;.  zMasterJ
1a130 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
1a140 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a  urnal] = 0;..  z
1a150 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
1a160 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c  rJournal;.  whil
1a170 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
1a180 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
1a190 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
1a1a0 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
1a1b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a1c0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
1a1d0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
1a1e0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
1a1f0 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20  xists);.    if( 
1a200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a210 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
1a220 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
1a230 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20  .    if( exists 
1a240 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ){.      /* One 
1a250 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
1a260 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
1a270 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a280 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a   exists..      *
1a290 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
1a2a0 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
1a2b0 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
1a2c0 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
1a2d0 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
1a2e0 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
1a2f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a300 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
1a310 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20  /.      int c;. 
1a320 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
1a330 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
1a340 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
1a350 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
1a360 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a370 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1a380 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
1a390 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
1a3a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a3b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a3c0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a3d0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a3e0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
1a3f0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
1a400 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
1a410 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
1a420 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1a430 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
1a440 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a460 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a470 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a480 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
1a490 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
1a4a0 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
1a4b0 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
1a4c0 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
1a4d0 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
1a4e0 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
1a4f0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1a500 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1a510 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
1a520 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a530 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a540 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
1a550 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
1a560 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a  ournal)+1);.  }.
1a570 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   .  sqlite3OsClo
1a580 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  se(pMaster);.  r
1a590 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1a5a0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
1a5b0 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
1a5c0 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1a5d0 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
1a5e0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61  rnal);.  if( pMa
1a5f0 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ster ){.    sqli
1a600 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
1a610 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1a620 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61   !isOpen(pJourna
1a630 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l) );.    sqlite
1a640 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
1a650 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a660 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1a670 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1a680 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
1a690 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
1a6a0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
1a6b0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
1a6c0 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
1a6d0 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
1a6e0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
1a6f0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
1a700 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
1a710 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
1a720 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
1a730 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
1a740 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1a750 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1a760 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
1a770 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  or the pager is 
1a780 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  not in either.**
1a790 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73   DBMOD or OPEN s
1a7a0 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
1a7b0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1a7c0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
1a7d0 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ize .** of the f
1a7e0 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ile is changed t
1a7f0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
1a800 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
1a810 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a  eSize bytes). .*
1a820 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
1a830 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
1a840 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
1a850 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
1a860 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
1a870 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
1a880 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
1a890 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
1a8a0 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
1a8b0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
1a8c0 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
1a8d0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
1a8e0 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
1a8f0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
1a900 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
1a910 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
1a920 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
1a930 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
1a940 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
1a950 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
1a960 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
1a970 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
1a980 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
1a990 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
1a9a0 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
1a9b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
1a9c0 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
1a9d0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1a9e0 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
1a9f0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1aa00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1aa10 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
1aa20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aa30 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
1aa40 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
1aa50 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1aa60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
1aa70 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
1aa80 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
1aa90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1aaa0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1aab0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1aac0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
1aad0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1aae0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1aaf0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
1ab00 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1ab10 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
1ab20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1ab30 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1ab40 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1ab50 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1ab60 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
1ab70 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
1ab80 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
1ab90 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
1aba0 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
1abb0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1abc0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1abd0 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
1abe0 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
1abf0 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
1ac00 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
1ac10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ac20 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1ac30 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
1ac40 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
1ac50 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
1ac60 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
1ac70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
1ac80 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
1ac90 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
1aca0 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
1acb0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
1acc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
1acd0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
1ace0 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
1acf0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72    }else if( (cur
1ad00 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29  rentSize+szPage)
1ad10 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  <=newSize ){.   
1ad20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
1ad30 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1ad40 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
1ad50 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
1ad60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
1ad70 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1ad80 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72  -szPage) == curr
1ad90 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1ada0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1adb0 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20  wSize-szPage) > 
1adc0 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1add0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ade0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1adf0 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a  er->fd, pTmp, sz
1ae00 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a  Page, newSize-sz
1ae10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1ae20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ae30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ae40 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1ae50 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1ae60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ae70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ae80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
1ae90 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e  anitized version
1aea0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   of the sector-s
1aeb0 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70  ize of OS file p
1aec0 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74  File. The.** ret
1aed0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61  urn value is gua
1aee0 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62  ranteed to lie b
1aef0 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41  etween 32 and MA
1af00 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1af10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63  /.int sqlite3Sec
1af20 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1af30 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1af40 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74  int iRet = sqlit
1af50 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
1af60 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65  File);.  if( iRe
1af70 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74  t<32 ){.    iRet
1af80 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20   = 512;.  }else 
1af90 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43  if( iRet>MAX_SEC
1afa0 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  TOR_SIZE ){.    
1afb0 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54  assert( MAX_SECT
1afc0 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a  OR_SIZE>=512 );.
1afd0 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53      iRet = MAX_S
1afe0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
1aff0 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
1b000 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1b010 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67  value of the Pag
1b020 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1b030 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67  riable for the g
1b040 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61  iven.** pager ba
1b050 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  sed on the value
1b060 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1b070 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74   xSectorSize met
1b080 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70  hod.** of the op
1b090 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1b0a0 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  . The sector siz
1b0b0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
1b0c0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
1b0d0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
1b0e0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
1b0f0 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
1b100 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b110 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
1b120 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
1b130 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
1b140 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1b150 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b160 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
1b170 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
1b180 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1b190 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
1b1a0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
1b1b0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b1c0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
1b1d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b1e0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
1b1f0 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
1b200 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
1b210 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1b220 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
1b230 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
1b240 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
1b250 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b260 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1b270 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1b280 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
1b290 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1b2a0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
1b2b0 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
1b2c0 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
1b2d0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
1b2e0 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
1b2f0 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
1b300 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
1b310 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
1b320 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
1b330 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
1b340 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
1b350 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
1b360 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
1b370 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
1b380 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
1b390 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
1b3a0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
1b3b0 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
1b3c0 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
1b3d0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
1b3e0 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
1b3f0 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
1b400 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
1b410 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
1b420 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
1b430 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
1b440 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
1b450 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
1b460 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
1b470 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
1b480 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b490 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
1b4a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b4b0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
1b4c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b4d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b4e0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1b4f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1b500 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1b510 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
1b520 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
1b530 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1b540 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b560 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1b570 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
1b580 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1b590 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
1b5a0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
1b5b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
1b5c0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
1b5d0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
1b5e0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1b5f0 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1b600 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1b610 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1b620 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1b630 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1b640 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1b650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1b660 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b670 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1b680 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1b690 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1b6a0 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1b6b0 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1b6c0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1b6d0 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1b6e0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1b6f0 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1b700 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1b710 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1b720 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1b730 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1b740 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1b750 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1b760 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1b770 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1b780 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b790 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b7a0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1b7b0 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1b7c0 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1b7d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b7e0 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1b7f0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1b800 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1b810 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1b820 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1b830 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1b840 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1b850 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b860 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b870 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1b880 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1b890 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1b8a0 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1b8b0 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1b8c0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1b8d0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1b8e0 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1b8f0 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1b900 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1b910 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1b920 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1b930 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1b940 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1b950 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1b960 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1b970 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1b980 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1b990 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1b9a0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1b9b0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1b9c0 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1b9d0 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1b9e0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1b9f0 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1ba00 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1ba10 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1ba20 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1ba30 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1ba40 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1ba50 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1ba60 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1ba70 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1ba80 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1ba90 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1baa0 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1bab0 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1bac0 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1bad0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1bae0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1baf0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1bb00 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1bb10 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1bb20 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1bb30 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1bb40 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1bb50 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1bb60 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1bb70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1bb80 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1bb90 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1bba0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1bbb0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1bbc0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1bbd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1bbe0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1bbf0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1bc00 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1bc10 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bc20 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1bc30 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1bc40 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1bc50 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bc60 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1bc70 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1bc80 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1bc90 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1bca0 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1bcb0 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1bcc0 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1bcd0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1bce0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1bcf0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1bd00 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1bd10 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1bd20 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1bd30 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1bd40 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1bd50 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1bd60 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1bd70 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1bd80 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1bd90 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1bda0 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1bdb0 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1bdc0 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1bdd0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1bde0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1bdf0 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1be00 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1be10 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1be20 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1be30 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1be40 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1be50 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1be60 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1be70 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1be80 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1be90 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1bea0 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1beb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1bec0 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1bed0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1bee0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1bef0 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1bf00 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1bf10 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1bf20 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1bf30 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1bf40 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1bf50 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1bf60 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1bf70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1bf80 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1bf90 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1bfa0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1bfb0 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1bfc0 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1bfd0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1bfe0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1bff0 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1c000 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1c010 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1c020 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1c030 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1c040 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1c050 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1c060 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1c070 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1c080 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1c090 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1c0a0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1c0b0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1c0c0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1c0d0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1c0e0 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1c0f0 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1c100 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1c110 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1c120 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1c130 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1c140 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1c150 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1c160 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1c170 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1c180 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1c190 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1c1a0 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1c1b0 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1c1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c1d0 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1c1e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1c1f0 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1c200 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1c210 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1c220 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1c230 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c250 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1c260 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1c270 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c280 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1c290 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1c2a0 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1c2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1c2c0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1c2d0 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1c2e0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1c2f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c300 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1c310 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1c320 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c330 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1c340 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1c350 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1c360 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1c370 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1c380 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1c390 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1c3a0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1c3b0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1c3c0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1c3d0 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1c3e0 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1c3f0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1c400 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1c410 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1c420 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1c430 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63  /.  int nPlaybac
1c440 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
1c450 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1c460 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66  pages restored f
1c470 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
1c480 20 75 33 32 20 73 61 76 65 64 50 61 67 65 53 69   u32 savedPageSi
1c490 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
1c4a0 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  eSize;..  /* Fig
1c4b0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1c4c0 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
1c4d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
1c4e0 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
1c4f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
1c500 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
1c510 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1c520 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
1c530 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c540 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1c550 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
1c560 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c570 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1c580 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1c590 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1c5a0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1c5b0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1c5c0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1c5d0 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1c5e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1c5f0 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1c600 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1c610 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1c620 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1c630 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1c640 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1c650 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1c660 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1c670 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1c680 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1c690 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1c6a0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1c6b0 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1c6c0 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1c6d0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1c6e0 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1c6f0 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1c700 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1c710 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1c720 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1c730 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1c740 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1c750 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e  .c,.  ** mxPathn
1c760 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1c770 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1c780 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1c790 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1c7a0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1c7b0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1c7c0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1c7d0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1c7e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1c7f0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1c800 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1c810 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1c820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c830 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1c840 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1c850 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1c860 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1c870 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1c880 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1c890 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1c8a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c8b0 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1c8c0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c8d0 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1c8e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1c8f0 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1c900 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1c910 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1c920 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1c930 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1c940 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1c950 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1c960 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1c970 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1c980 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1c990 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1c9a0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1c9b0 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1c9c0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1c9d0 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1c9e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1c9f0 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1ca00 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1ca10 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1ca20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1ca30 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1ca40 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1ca50 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1ca60 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1ca70 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1ca80 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1ca90 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1caa0 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1cab0 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1cac0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1cad0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1cae0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1caf0 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1cb00 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1cb10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cb20 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1cb30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1cb40 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1cb50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1cb60 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1cb70 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1cb80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1cb90 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1cba0 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1cbb0 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1cbc0 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1cbd0 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1cbe0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1cbf0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1cc00 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1cc10 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1cc20 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1cc30 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1cc40 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1cc50 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1cc60 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1cc70 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1cc80 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1cc90 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1cca0 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1ccb0 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1ccc0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1ccd0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1cce0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1ccf0 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1cd00 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1cd10 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1cd20 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1cd30 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1cd40 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1cd50 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1cd60 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1cd70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1cd80 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1cd90 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1cda0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1cdb0 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1cdc0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1cdd0 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1cde0 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1cdf0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1ce00 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1ce10 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1ce20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1ce30 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1ce40 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1ce50 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1ce60 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1ce70 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1ce80 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1ce90 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1cea0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1ceb0 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1cec0 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1ced0 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1cee0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1cef0 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1cf00 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1cf10 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1cf20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1cf30 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1cf40 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1cf50 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1cf60 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1cf70 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1cf80 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1cf90 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1cfa0 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1cfb0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1cfc0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1cfd0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1cfe0 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1cff0 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1d000 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1d010 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1d020 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1d030 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1d040 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1d050 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1d060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1d070 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1d080 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1d090 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1d0a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1d0b0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1d0c0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1d0d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1d0e0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1d0f0 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1d100 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1d110 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1d120 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1d130 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1d140 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1d150 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1d160 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1d170 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1d180 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1d190 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1d1a0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1d1b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1d1c0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1d1d0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1d1e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1d1f0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1d200 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1d210 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d230 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d240 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1d250 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1d260 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1d270 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1d280 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1d290 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1d2a0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1d2b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1d2c0 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1d2d0 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1d2e0 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1d2f0 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1d300 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1d310 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1d320 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1d330 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1d340 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1d350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1d360 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1d370 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1d380 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1d390 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1d3a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d3b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d3c0 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20  nPlayback++;.   
1d3d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d3e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d3f0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1d400 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d410 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1d420 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d430 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d440 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1d450 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1d460 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1d470 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1d480 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1d490 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1d4a0 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1d4b0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1d4c0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1d4d0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1d4e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1d4f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1d500 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1d510 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1d520 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1d530 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1d540 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1d550 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1d560 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1d570 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1d580 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1d590 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1d5a0 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1d5b0 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1d5c0 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1d5d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d5e0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1d5f0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1d600 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d610 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1d620 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1d630 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1d640 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1d650 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1d660 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1d670 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1d680 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1d690 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1d6a0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1d6b0 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1d6c0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1d6d0 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1d6e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1d6f0 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1d700 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1d710 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1d720 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1d730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1d740 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d750 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1d760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d770 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1d780 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1d790 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1d7a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d7b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1d7c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
1d7d0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
1d7e0 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20 2d  savedPageSize, -
1d7f0 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f 6c  1);.  }.  /* Fol
1d800 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1d810 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1d820 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1d830 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1d840 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1d850 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1d860 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1d870 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1d880 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1d890 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d8a0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1d8b0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1d8c0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1d8d0 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1d8e0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1d8f0 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1d900 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1d910 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1d920 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1d930 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ods ){.    sqlit
1d940 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1d950 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1d960 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1d970 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d  NCHANGED,0);.  }
1d980 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1d990 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
1d9a0 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
1d9b0 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
1d9c0 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
1d9d0 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
1d9e0 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
1d9f0 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
1da00 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
1da10 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
1da20 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
1da30 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
1da40 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
1da50 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1da60 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
1da70 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
1da80 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
1da90 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
1daa0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
1dab0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
1dac0 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
1dad0 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
1dae0 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
1daf0 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
1db00 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1db10 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
1db20 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
1db30 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
1db40 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
1db50 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
1db60 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
1db70 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1db80 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
1db90 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
1dba0 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
1dbb0 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
1dbc0 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
1dbd0 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
1dbe0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1dbf0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
1dc00 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
1dc10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dc20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1dc30 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1dc40 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
1dc50 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1dc60 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1dc70 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1dc80 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
1dc90 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1dca0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1dcb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dcc0 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65  _OK.   && (pPage
1dcd0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1dce0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1dcf0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1dd00 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1dd10 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1dd20 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1dd30 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 0);.  }.  if
1dd40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dd50 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1dd60 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1dd70 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1dd80 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a  r[0]!='\0', 0);.
1dd90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1dda0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1ddb0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1ddc0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1ddd0 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
1dde0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1ddf0 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
1de00 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
1de10 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1de20 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
1de30 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
1de40 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
1de50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1de60 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
1de70 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
1de80 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
1de90 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
1dea0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1deb0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1dec0 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61  isHot && nPlayba
1ded0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1dee0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
1def0 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
1df00 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64  BACK, "recovered
1df10 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25   %d pages from %
1df20 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1df30 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70      nPlayback, p
1df40 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
1df50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1df60 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1df70 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1df80 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1df90 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1dfa0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1dfb0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1dfc0 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1dfd0 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1dfe0 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1dff0 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1e000 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1e010 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1e020 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1e030 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1e040 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1e050 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1e060 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1e070 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1e080 74 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72 20  tabase file (or 
1e090 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41  out of.** the WA
1e0a0 4c 20 69 66 20 74 68 61 74 20 69 73 20 77 68 65  L if that is whe
1e0b0 72 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  re the most rece
1e0c0 6e 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e 64  nt copy if found
1e0d0 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  ) into .** pPg->
1e0e0 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1e0f0 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1e100 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1e110 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1e120 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1e130 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e140 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1e150 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1e160 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1e170 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1e180 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1e190 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1e1a0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e1b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1e1c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1e1d0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1e1e0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1e1f0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1e200 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1e210 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e220 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1e230 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1e240 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1e250 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e260 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1e270 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1e280 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1e290 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  pPg */.  int rc 
1e2a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1e2b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e2c0 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  code */..#ifndef
1e2d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e2e0 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20  .  u32 iFrame = 
1e2f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e300 2f 2a 20 46 72 61 6d 65 20 6f 66 20 57 41 4c 20  /* Frame of WAL 
1e310 63 6f 6e 74 61 69 6e 69 6e 67 20 70 67 6e 6f 20  containing pgno 
1e320 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1e330 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1e340 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d  GER_READER && !M
1e350 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
1e360 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1e370 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  >fd) );..  if( p
1e380 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1e390 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  r) ){.    rc = s
1e3a0 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e3b0 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e3c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e3d0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1e3e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e3f0 7d 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29  }.  if( iFrame )
1e400 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e410 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70  e3WalReadFrame(p
1e420 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72  Pager->pWal, iFr
1e430 61 6d 65 2c 70 50 61 67 65 72 2d 3e 70 61 67 65  ame,pPager->page
1e440 53 69 7a 65 2c 70 50 67 2d 3e 70 44 61 74 61 29  Size,pPg->pData)
1e450 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1e460 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  .  {.    i64 iOf
1e470 66 73 65 74 20 3d 20 28 70 50 67 2d 3e 70 67 6e  fset = (pPg->pgn
1e480 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1e490 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1e4a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1e4b0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1e4c0 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65  Pg->pData, pPage
1e4d0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
1e4e0 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
1e4f0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1e500 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1e510 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e520 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1e530 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
1e540 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
1e550 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1e560 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
1e570 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1e580 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
1e590 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
1e5a0 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
1e5b0 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
1e5c0 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
1e5d0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
1e5e0 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
1e5f0 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
1e600 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1e610 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
1e620 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
1e630 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
1e640 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1e650 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
1e660 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
1e670 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
1e680 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
1e690 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1e6a0 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
1e6b0 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
1e6c0 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
1e6d0 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
1e6e0 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
1e6f0 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
1e700 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1e710 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
1e720 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
1e730 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
1e740 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
1e750 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
1e760 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1e770 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
1e780 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
1e790 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
1e7a0 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
1e7b0 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ise equaling 16 
1e7c0 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
1e7d0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1e7e0 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
1e7f0 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
1e800 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
1e810 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
1e820 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1e830 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
1e840 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1e850 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e860 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
1e870 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
1e880 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
1e890 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1e8a0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1e8b0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1e8c0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1e8d0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
1e8e0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1e8f0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
1e900 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20  Pg->pgno, 3, rc 
1e910 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1e920 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  KPT);..  PAGER_I
1e930 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1e940 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1e950 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1e960 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1e970 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1e980 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1e990 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1e9a0 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1e9b0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1e9c0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1e9e0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1e9f0 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
1ea00 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1ea10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ea20 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1ea30 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1ea40 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1ea50 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1ea60 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1ea70 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1ea80 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1ea90 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1eaa0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1eab0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1eac0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1ead0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1eae0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1eaf0 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1eb00 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1eb10 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1eb20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1eb30 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1eb40 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1eb50 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1eb60 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1eb70 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1eb80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1eb90 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1eba0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1ebb0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1ebc0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1ebd0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1ebe0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1ebf0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1ec00 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1ec10 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1ec20 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1ec30 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1ec40 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ec50 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1ec60 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1ec70 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1ec80 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1ec90 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1eca0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1ecb0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1ecc0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1ecd0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1ece0 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1ecf0 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1ed00 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1ed10 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1ed20 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1ed30 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1ed40 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1ed50 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1ed60 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1ed70 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1ed80 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1ed90 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1eda0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1edb0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1edc0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1edd0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1ede0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1edf0 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1ee00 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1ee10 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1ee20 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1ee30 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1ee40 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1ee50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1ee60 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1ee70 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1ee80 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1ee90 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1eea0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1eeb0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1eec0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1eed0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1eee0 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1eef0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1ef00 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1ef10 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1ef20 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1ef30 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1ef40 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1ef50 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1ef60 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1ef70 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1ef80 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1ef90 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1efa0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1efb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1efc0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1efd0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1efe0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1eff0 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1f000 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1f010 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1f020 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1f030 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1f040 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1f060 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1f070 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1f080 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1f090 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1f0a0 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1f0b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1f0c0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1f0d0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1f0e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1f0f0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1f100 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1f110 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1f120 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1f130 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f140 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
1f150 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f170 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1f180 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1f190 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1f1a0 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1f1b0 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1f1c0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1f1d0 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1f1e0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1f1f0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1f200 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1f210 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1f220 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1f230 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1f240 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1f250 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1f260 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1f270 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1f280 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1f290 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1f2a0 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1f2b0 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1f2c0 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1f2d0 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1f2e0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1f2f0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1f300 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1f310 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1f320 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1f330 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1f340 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1f350 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1f360 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1f370 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1f380 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1f390 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1f3a0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1f3b0 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1f3c0 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1f3d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f3e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f3f0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1f400 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1f410 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1f420 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1f430 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1f440 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1f450 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f480 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1f490 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1f4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1f4b0 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1f4c0 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1f4d0 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1f4e0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1f4f0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1f500 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1f510 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1f520 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1f530 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1f540 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1f550 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1f560 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1f570 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1f580 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1f590 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1f5a0 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1f5b0 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1f5c0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1f5d0 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1f5e0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1f5f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1f600 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1f610 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1f620 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1f630 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1f640 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1f650 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1f660 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1f670 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f680 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f690 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1f6a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1f6b0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1f6c0 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1f6d0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1f6e0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1f6f0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1f700 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1f710 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1f720 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f740 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1f750 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1f760 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1f770 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1f780 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1f790 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1f7a0 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1f7b0 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1f7c0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1f7d0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1f7e0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1f7f0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1f800 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1f810 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1f820 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1f830 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1f840 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1f850 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1f860 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1f870 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1f880 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1f890 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1f8a0 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1f8b0 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1f8c0 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1f8d0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1f8e0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1f8f0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1f900 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1f910 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1f920 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f940 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1f950 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1f960 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1f970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1f980 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1f990 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1f9a0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1f9d0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1f9e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1fa10 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1fa20 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1fa30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fa40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1fa50 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1fa60 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1fa80 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1fa90 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1faa0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1fab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1fac0 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1fad0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1fae0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1faf0 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1fb00 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1fb10 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1fb20 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1fb30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1fb40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1fb50 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1fb60 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1fb70 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1fb80 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1fb90 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1fba0 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1fbb0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1fbc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1fbd0 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1fbe0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1fbf0 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1fc00 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1fc10 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1fc20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1fc30 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1fc40 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1fc50 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1fc60 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1fc70 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1fc80 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1fc90 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1fca0 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1fcb0 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1fcc0 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1fcd0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1fce0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1fcf0 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1fd00 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1fd10 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1fd20 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1fd30 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1fd40 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1fd50 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1fd60 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1fd70 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1fd80 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1fd90 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1fda0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1fdb0 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1fdc0 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1fdd0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1fde0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1fdf0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1fe00 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1fe10 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1fe20 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1fe30 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1fe40 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1fe50 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1fe60 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1fe70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1fe80 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1fe90 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1fea0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1feb0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1fec0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1fed0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1fee0 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1fef0 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1ff00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1ff10 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1ff20 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1ff30 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1ff40 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1ff50 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1ff60 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1ff70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1ff80 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1ff90 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1ffa0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1ffb0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1ffc0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ffd0 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1ffe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fff0 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
20000 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
20010 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
20020 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
20030 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
20040 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
20050 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
20060 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
20070 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
20080 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
20090 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
200a0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
200b0 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
200c0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
200d0 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
200e0 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
200f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
20100 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
20110 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
20120 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20150 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
20160 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
20170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20180 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
20190 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
201a0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
201b0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
201c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
201d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
201e0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
201f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
20200 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
20210 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
20220 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
20230 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
20240 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
20250 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
20260 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
20270 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
20280 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
20290 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
202a0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
202b0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
202c0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
202d0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
202e0 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
202f0 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
20300 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
20310 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
20320 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
20330 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
20340 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
20350 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
20360 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
20370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20380 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
20390 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
203a0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
203b0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
203c0 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
203d0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
203e0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
203f0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
20400 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20410 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20420 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
20430 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
20440 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
20450 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
20460 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
20470 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20480 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
20490 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
204a0 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
204b0 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
204c0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
204d0 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
204e0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
204f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20500 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
20510 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20520 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
20530 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
20540 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
20550 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
20560 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
20570 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
20580 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
20590 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
205a0 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
205b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
205c0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
205d0 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
205e0 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
205f0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20600 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
20610 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
20620 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
20630 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
20640 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
20650 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
20660 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
20670 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
20680 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
20690 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
206a0 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
206b0 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
206c0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
206d0 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
206e0 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
206f0 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
20700 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
20710 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
20720 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
20730 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
20740 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
20750 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
20760 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
20770 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20780 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20790 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
207a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
207b0 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
207c0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
207d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
207e0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
207f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20800 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20  e==0 );.  nPage 
20810 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
20820 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
20830 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  ;..  /* If the n
20840 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
20850 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
20860 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
20870 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41  from the.  ** WA
20880 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65  L sub-system, de
20890 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65  termine the page
208a0 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e 20   count based on 
208b0 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
208c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
208d0 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
208e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
208f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
20900 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
20910 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
20920 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
20930 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
20940 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
20950 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65   && ALWAYS(isOpe
20960 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29  n(pPager->fd)) )
20970 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  {.    i64 n = 0;
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
209a0 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  b file in bytes 
209b0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
209c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
209d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
209e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
209f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20a00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20a10 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
20a20 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d  Pgno)((n+pPager-
20a30 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70  >pageSize-1) / p
20a40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20a50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
20a60 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
20a70 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
20a80 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
20a90 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
20aa0 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
20ab0 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
20ac0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
20ad0 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
20ae0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
20af0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
20b00 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
20b10 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
20b20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
20b30 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
20b40 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
20b50 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
20b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20b70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
20b80 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
20b90 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
20ba0 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
20bb0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
20bc0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
20bd0 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
20be0 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
20bf0 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
20c00 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
20c10 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
20c20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
20c30 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
20c40 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
20c50 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
20c60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
20c70 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
20c80 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
20c90 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
20ca0 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
20cb0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
20cc0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
20cd0 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
20ce0 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
20cf0 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
20d00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
20d10 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
20d20 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
20d30 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
20d40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
20d50 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
20d60 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
20d70 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
20d80 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
20d90 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
20da0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20db0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
20dc0 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
20dd0 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
20de0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
20df0 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
20e00 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
20e10 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
20e20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
20e30 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
20e40 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
20e50 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
20e60 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
20e70 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
20e80 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
20e90 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
20ea0 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
20eb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
20ec0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20ed0 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
20ee0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20ef0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20f00 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
20f10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20f20 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
20f30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20f40 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
20f50 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  OCK );..  if( !p
20f60 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
20f70 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
20f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20f90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20fa0 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
20fb0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
20fc0 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
20fd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66       pPager->pVf
20fe0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
20ff0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
21000 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20  XISTS, &isWal.  
21010 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
21020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21030 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b      if( isWal ){
21040 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  .        Pgno nP
21050 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
21060 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21070 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21080 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ile */..        
21090 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
210a0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
210b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
210c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
210d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
210e0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
210f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
21100 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
21110 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
21120 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
21130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21140 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
21150 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
21160 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
21170 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e)==0 );.       
21180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21190 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
211a0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
211b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
211c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
211d0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
211e0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
211f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21200 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
21210 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21220 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
21230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21240 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
21250 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
21260 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
21270 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
21280 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
21290 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
212a0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
212b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
212c0 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
212d0 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
212e0 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
212f0 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
21300 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
21310 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
21320 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
21330 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
21340 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
21350 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
21360 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
21370 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
21380 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
21390 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
213a0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
213b0 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
213c0 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
213d0 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
213e0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
213f0 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
21400 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
21410 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
21420 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21430 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
21440 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
21450 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
21460 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
21470 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
21480 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21490 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
214a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
214b0 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
214c0 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
214d0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
214e0 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
214f0 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
21500 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21510 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
21520 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
21530 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
21540 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
21550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
21560 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
21570 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
21580 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
21590 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
215a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
215b0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
215c0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
215d0 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
215e0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
215f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
21600 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
21610 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
21620 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
21630 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
21640 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
21650 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
21660 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
21670 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
21680 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
21690 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
216a0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
216b0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
216c0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
216d0 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
216e0 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
216f0 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
21700 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
21710 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
21720 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
21730 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
21740 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21750 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
21760 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
21770 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
21780 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
21790 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
217a0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
217b0 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
217c0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
217d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
217e0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
217f0 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
21800 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
21810 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
21820 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
21830 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
21840 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
21850 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
21860 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
21870 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
21880 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
21890 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
218a0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
218b0 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
218c0 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
218d0 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
218e0 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
218f0 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
21900 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
21910 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
21920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21930 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
21940 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
21950 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
21960 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
21970 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21990 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
219a0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
219b0 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
219c0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
219d0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
219e0 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
219f0 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
21a00 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
21a10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
21a20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21a30 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
21a40 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
21a50 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
21a60 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
21a70 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
21a80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21a90 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
21aa0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
21ab0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
21ac0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
21ad0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
21ae0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
21af0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
21b00 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
21b10 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
21b20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21b30 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
21b40 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
21b50 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
21b60 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
21b70 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
21b80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21b90 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
21ba0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
21bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
21bc0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
21bd0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
21be0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
21bf0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
21c00 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
21c10 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
21c20 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
21c30 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
21c40 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
21c50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
21c60 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
21c70 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
21c80 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
21c90 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
21ca0 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
21cb0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
21cc0 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
21cd0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
21ce0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
21cf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21d00 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
21d10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
21d20 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
21d30 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
21d40 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
21d50 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
21d60 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
21d70 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
21d80 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
21d90 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
21da0 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
21db0 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
21dc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21dd0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
21de0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
21df0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
21e00 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
21e10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21e20 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
21e30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
21e40 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
21e50 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
21e60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21e70 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
21e80 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
21e90 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
21ea0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
21eb0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
21ec0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
21ed0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
21ee0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21ef0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
21f00 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
21f10 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
21f20 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
21f30 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
21f40 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
21f50 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
21f60 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
21f70 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
21f80 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
21f90 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
21fa0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
21fb0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
21fc0 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
21fd0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
21fe0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
21ff0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
22000 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
22010 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
22020 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
22030 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
22040 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
22050 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
22060 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
22070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
22080 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
22090 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
220a0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
220b0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
220c0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
220d0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
220e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
220f0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
22100 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
22110 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
22120 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
22130 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
22140 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
22150 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
22160 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
22170 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
22180 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
22190 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
221a0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
221b0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
221c0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
221d0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
221e0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
221f0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
22200 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
22210 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
22220 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
22230 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
22240 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22250 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22260 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
22270 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
22280 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22290 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
222a0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
222b0 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
222c0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
222d0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
222e0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
222f0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
22300 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
22310 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
22320 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
22330 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
22340 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
22350 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
22360 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
22370 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
22380 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
22390 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
223a0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
223b0 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
223c0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
223d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
223e0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
223f0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
22400 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
22410 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
22420 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
22430 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
22440 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
22450 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
22460 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
22470 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
22480 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
22490 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
224a0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
224b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
224c0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
224d0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
224e0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
224f0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
22500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
22510 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
22520 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
22530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22540 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
22550 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
22570 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
22580 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22590 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
225a0 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
225b0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
225c0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
225d0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
225e0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
225f0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
22600 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
22610 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
22620 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
22630 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
22640 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
22650 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
22660 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
22670 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
22680 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
22690 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
226a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
226b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
226c0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
226d0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
226e0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
226f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
22700 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
22710 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
22720 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22730 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
22740 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
22750 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
22760 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
22770 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
22780 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
22790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
227a0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
227b0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
227c0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
227d0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
227e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
227f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22800 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
22810 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
22820 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
22830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22840 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
22850 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
22860 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
22870 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
22880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22890 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
228a0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
228b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
228c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
228d0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
228e0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
228f0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
22900 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
22910 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
22920 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61   recycle clean a
22930 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e  nd unused pages.
22940 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22950 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
22960 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22970 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
22980 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22990 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
229a0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
229b0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  e);.}../*.** Cha
229c0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
229d0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
229e0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
229f0 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
22a00 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
22a10 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74  to spill pages t
22a20 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  o journal..*/.in
22a30 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
22a40 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72  tSpillsize(Pager
22a50 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
22a60 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
22a70 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22a80 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72  Spillsize(pPager
22a90 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
22aa0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  e);.}../*.** Inv
22ab0 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  oke SQLITE_FCNTL
22ac0 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64  _MMAP_SIZE based
22ad0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
22ae0 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e  value of szMmap.
22af0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22b00 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
22b10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22b20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
22b30 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71  MMAP_SIZE>0.  sq
22b40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
22b50 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69   pPager->fd;.  i
22b60 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26  f( isOpen(fd) &&
22b70 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69   fd->pMethods->i
22b80 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20  Version>=3 ){.  
22b90 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22ba0 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61  sz;.    sz = pPa
22bb0 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20  ger->szMmap;.   
22bc0 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
22bd0 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ch = (sz>0);.   
22be0 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
22bf0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
22c00 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
22c10 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
22c20 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
22c30 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
22c40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
22c50 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22c60 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
22c70 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
22c80 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
22c90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
22ca0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22cb0 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
22cc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
22cd0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
22ce0 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
22cf0 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
22d00 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
22d10 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
22d20 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
22d30 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
22d40 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
22d50 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
22d60 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
22d70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22d80 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
22d90 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
22da0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
22db0 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
22dc0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
22dd0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
22de0 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
22df0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
22e00 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
22e10 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22e20 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
22e30 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
22e40 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
22e50 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
22e60 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
22e70 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
22e80 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
22e90 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
22ea0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
22eb0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
22ec0 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
22ed0 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73 3a  are four levels:
22ee0 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
22ef0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
22f00 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
22f10 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
22f20 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
22f30 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
22f40 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
22f50 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
22f60 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
22f70 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
22f80 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
22f90 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
22fa0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
22fb0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
22fc0 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
22fd0 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
22fe0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
22ff0 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
23000 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
23010 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
23020 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
23030 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
23040 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
23050 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
23060 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
23070 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
23080 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
23090 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
230a0 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
230b0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
230c0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
230d0 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
230e0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
230f0 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
23100 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
23110 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
23120 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
23140 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
23150 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
23160 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
23170 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
23180 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
23190 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
231a0 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
231b0 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
231c0 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
231d0 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
231e0 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
231f0 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
23200 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
23210 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
23220 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
23230 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
23250 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
23260 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
23270 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
23280 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
23290 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
232a0 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
232b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
232c0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
232d0 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20 20  *.**    EXTRA   
232e0 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 46    This is like F
232f0 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74 20  ULL except that 
23300 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74 68  is also syncs th
23310 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 20  e directory.**  
23320 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
23330 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
23340 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
23350 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61 63  fter the rollbac
23360 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
23370 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e 6c    journal is unl
23380 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inked..**.** The
23390 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
233a0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
233b0 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
233c0 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
233d0 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
233e0 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
233f0 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
23400 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
23410 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
23420 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
23430 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
23440 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
23450 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
23460 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
23470 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
23480 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
23490 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
234a0 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
234b0 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
234c0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
234d0 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
234e0 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
234f0 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
23500 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
23510 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
23520 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
23530 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
23540 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
23550 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
23560 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
23570 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
23580 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
23590 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
235a0 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69 73  ORMAL.  There is
235b0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
235c0 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61  etween FULL.** a
235d0 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41 4c  nd EXTRA for WAL
235e0 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20   mode..**.** Do 
235f0 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
23600 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
23610 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
23620 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
23630 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
23640 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
23650 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
23660 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
23670 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
23680 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
23690 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
236a0 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
236b0 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
236c0 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
236d0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
236e0 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
236f0 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
23700 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23710 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
23720 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
23730 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
23740 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
23750 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
23760 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
23770 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
23780 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
23790 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
237a0 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
237b0 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
237c0 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
237d0 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
237e0 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
237f0 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
23800 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
23810 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
23820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23830 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
23840 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23850 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65  SetFlags(.  Page
23860 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23870 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
23880 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
23890 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  el for */.  unsi
238a0 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
238b0 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61    /* Various fla
238c0 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  gs */.){.  unsig
238d0 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c  ned level = pgFl
238e0 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
238f0 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20  HRONOUS_MASK;.  
23900 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
23910 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
23920 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
23930 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
23940 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
23950 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
23960 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
23970 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
23980 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52   =  level==PAGER
23990 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
239a0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65   ?1:0;.    pPage
239b0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
239c0 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel>=PAGER_SYNCH
239d0 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30  RONOUS_FULL ?1:0
239e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
239f0 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  traSync = level=
23a00 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
23a10 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20  US_EXTRA ?1:0;. 
23a20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
23a30 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  >noSync ){.    p
23a40 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23a50 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
23a60 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
23a70 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
23a80 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23a90 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23aa0 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
23ab0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
23ac0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23ad0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
23ae0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
23af0 79 6e 63 46 6c 61 67 73 20 3d 20 28 70 50 61 67  yncFlags = (pPag
23b00 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3c 3c 32  er->syncFlags<<2
23b10 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
23b20 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
23b30 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
23b40 46 6c 61 67 73 20 7c 3d 20 70 50 61 67 65 72 2d  Flags |= pPager-
23b50 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 7d 0a  >syncFlags;.  }.
23b60 20 20 69 66 28 20 28 70 67 46 6c 61 67 73 20 26    if( (pgFlags &
23b70 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c   PAGER_CKPT_FULL
23b80 46 53 59 4e 43 29 20 26 26 20 21 70 50 61 67 65  FSYNC) && !pPage
23b90 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
23ba0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
23bb0 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  Flags |= (SQLITE
23bc0 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32 29 3b 0a  _SYNC_FULL<<2);.
23bd0 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67    }.  if( pgFlag
23be0 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53  s & PAGER_CACHES
23bf0 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67  PILL ){.    pPag
23c00 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
23c10 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  = ~SPILLFLAG_OFF
23c20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23c30 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
23c40 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  l |= SPILLFLAG_O
23c50 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  FF;.  }.}.#endif
23c60 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
23c70 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
23c80 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
23c90 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
23ca0 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
23cb0 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
23cc0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
23cd0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
23ce0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
23cf0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
23d00 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
23d10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23d20 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
23d30 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
23d40 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
23d50 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
23d60 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
23d70 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
23d80 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
23d90 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
23da0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
23db0 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
23dc0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
23dd0 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
23de0 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
23df0 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
23e00 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
23e10 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
23e20 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
23e30 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
23e40 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
23e50 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
23e60 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
23e70 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
23e80 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
23e90 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
23ea0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
23eb0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23ec0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
23ed0 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
23ee0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
23ef0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
23f00 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
23f10 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
23f20 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
23f30 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
23f40 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
23f50 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
23f60 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
23f70 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
23f80 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
23f90 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
23fa0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
23fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
23fc0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
23fd0 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
23fe0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
23ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24000 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
24010 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24020 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
24030 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
24040 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
24050 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
24060 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
24070 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
24080 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
24090 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
240a0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
240b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
240c0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
240d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
240e0 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
240f0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
24100 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
24110 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
24120 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
24130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
24140 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
24150 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24160 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
24170 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
24180 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
24190 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
241a0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
241b0 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
241c0 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
241d0 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
241e0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
241f0 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
24200 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
24210 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
24220 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
24230 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
24240 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
24250 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
24260 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
24270 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
24280 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
24290 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
242a0 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
242b0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
242c0 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
242d0 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
242e0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
242f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
24300 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
24310 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
24320 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
24330 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
24340 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
24350 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
24360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
24390 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
243a0 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
243b0 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
243c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
243d0 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
243e0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
243f0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
24400 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
24410 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
24420 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
24430 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
24440 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
24450 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
24460 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
24470 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
24480 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
24490 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
244a0 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
244b0 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
244c0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
244d0 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
244e0 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
244f0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
24500 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
24510 79 48 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yHandler(.  Page
24520 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
24550 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
24560 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
24570 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
24580 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
24590 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
245a0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
245b0 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
245c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
245d0 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
245e0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
245f0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
24600 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
24610 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
24620 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
24630 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
24640 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
24650 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24660 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
24670 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
24680 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24690 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
246a0 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
246b0 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
246c0 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
246d0 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
246e0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
246f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
24700 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
24710 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
24720 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
24730 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
24740 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
24750 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
24760 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
24770 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
24780 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
24790 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
247a0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
247b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
247c0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
247d0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
247e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
247f0 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
24800 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
24810 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
24820 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
24830 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
24840 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
24850 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
24860 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
24870 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
24880 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
24890 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
248a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
248b0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
248c0 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
248d0 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
248e0 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
248f0 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
24900 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
24910 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
24920 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
24930 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
24940 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
24950 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
24960 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
24970 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
24980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24990 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
249a0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
249b0 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
249c0 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
249d0 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
249e0 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
249f0 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
24a00 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
24a10 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
24a20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
24a30 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
24a40 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24a50 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
24a60 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24a70 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
24a80 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
24a90 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
24aa0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
24ab0 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
24ac0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
24ad0 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
24ae0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
24af0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
24b00 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
24b10 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
24b20 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
24b30 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
24b40 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
24b50 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
24b60 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
24b70 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
24b80 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
24b90 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
24ba0 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
24bb0 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
24bc0 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
24bd0 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
24be0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
24bf0 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
24c00 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
24c10 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
24c20 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
24c30 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
24c40 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
24c50 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
24c60 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
24c70 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
24c80 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
24c90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
24ca0 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
24cb0 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
24cc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24cd0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
24ce0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
24cf0 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
24d00 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
24d10 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
24d20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
24d30 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
24d40 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
24d50 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
24d60 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
24d70 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
24d80 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
24d90 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
24da0 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
24db0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
24dc0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
24dd0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24de0 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
24df0 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
24e00 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
24e10 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
24e20 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
24e30 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
24e40 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
24e50 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
24e60 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
24e70 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
24e80 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
24e90 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
24ea0 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
24eb0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
24ec0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
24ed0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
24ee0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
24ef0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
24f00 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
24f10 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
24f20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
24f30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
24f40 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
24f50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
24f60 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
24f70 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
24f80 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
24f90 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
24fa0 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
24fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24fc0 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
24fd0 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
24fe0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
24ff0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
25000 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
25010 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
25020 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
25030 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
25040 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
25050 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
25060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25070 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
25080 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
25090 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
250a0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
250b0 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
250c0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
250d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
250e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
250f0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
25100 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
25110 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
25120 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
25130 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25140 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
25150 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
25170 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
25180 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
25190 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
251a0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
251b0 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  w;.      pPager-
251c0 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
251d0 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65  ((nByte+pageSize
251e0 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  -1)/pageSize);. 
251f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
25200 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
25210 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25220 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
25230 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a  ee(pNew);.    }.
25240 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a    }..  *pPageSiz
25250 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
25260 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Size;.  if( rc==
25270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25280 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
25290 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61  ) nReserve = pPa
252a0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  ger->nReserve;. 
252b0 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65     assert( nRese
252c0 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
252d0 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70  ve<1000 );.    p
252e0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
252f0 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b  = (i16)nReserve;
25300 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
25310 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
25320 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
25330 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  it(pPager);.  }.
25340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25350 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
25360 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
25370 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
25380 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
25390 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
253a0 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
253b0 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
253c0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
253d0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
253e0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
253f0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
25400 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
25410 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
25420 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
25430 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
25440 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
25450 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
25460 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
25470 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
25480 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
25490 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
254a0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
254b0 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
254c0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
254d0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
254e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
254f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
25500 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
25510 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
25520 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
25530 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
25540 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
25550 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
25560 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
25570 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
25580 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
25590 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
255a0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
255b0 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
255c0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
255d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
255e0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
255f0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
25600 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
25610 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
25620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25630 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
25640 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25650 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
25660 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
25670 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
25680 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
25690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
256a0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
256b0 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20  OPEN );      /* 
256c0 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f  Called only by O
256d0 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20  P_MaxPgcnt */.  
256e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
256f0 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e  mxPgno>=pPager->
25700 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50  dbSize );  /* OP
25710 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63  _MaxPgcnt enforc
25720 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74  es this */.  ret
25730 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
25740 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
25750 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
25760 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
25770 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
25780 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
25790 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
257a0 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
257b0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
257c0 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
257d0 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
257e0 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
257f0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
25800 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
25810 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
25820 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
25830 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
25840 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
25850 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
25860 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
25870 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
25880 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
25890 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
258a0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
258b0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
258c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
258d0 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
258e0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
258f0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
25900 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
25910 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25920 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
25930 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
25940 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
25950 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
25960 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25970 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
25980 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
25990 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
259a0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
259b0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
259c0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
259d0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
259e0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
259f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
25a00 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
25a10 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
25a20 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
25a30 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
25a40 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
25a50 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
25a60 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
25a70 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
25a80 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
25a90 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
25aa0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
25ab0 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
25ac0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
25ad0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
25ae0 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
25af0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
25b00 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
25b10 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
25b20 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
25b30 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
25b40 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
25b50 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
25b60 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
25b70 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
25b80 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
25b90 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
25ba0 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
25bb0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
25bc0 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
25bd0 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
25be0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
25bf0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
25c00 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
25c10 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
25c20 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
25c30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
25c40 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
25c50 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
25c60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
25c70 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
25c80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25c90 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
25ca0 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
25cb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25cc0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
25cd0 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
25ce0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
25cf0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
25d00 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
25d10 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
25d20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
25d30 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74  y btree immediat
25d40 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69  ely after creati
25d50 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65  ng.  ** the Page
25d60 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65  r object.  There
25d70 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e   has not been an
25d80 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
25d90 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20  transition.  ** 
25da0 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e  to WAL mode yet.
25db0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25dc0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
25dd0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69  ger) );..  if( i
25de0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
25df0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
25e00 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
25e10 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
25e20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25e30 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
25e40 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
25e50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
25e60 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
25e70 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
25e80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25e90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25ea0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
25eb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
25ec0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
25ed0 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  when a read-tran
25ee0 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
25ef0 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e  on.** the pager.
25f00 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   It returns the 
25f10 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
25f20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
25f30 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77  abase..**.** How
25f40 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c  ever, if the fil
25f50 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61  e is between 1 a
25f60 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62  nd <page-size> b
25f70 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
25f80 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63  en .** this is c
25f90 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61  onsidered a 1 pa
25fa0 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ge file..*/.void
25fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25fc0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
25fd0 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
25fe0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
25ff0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
26000 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
26010 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26020 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
26030 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b  ITER_FINISHED );
26040 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e  .  *pnPage = (in
26050 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  t)pPager->dbSize
26060 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
26070 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
26080 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
26090 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
260a0 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
260b0 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
260c0 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
260d0 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
260e0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
260f0 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
26100 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
26110 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
26120 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
26130 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
26140 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
26150 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
26160 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
26170 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
26180 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
26190 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
261a0 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
261b0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
261c0 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
261d0 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
261e0 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
261f0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
26200 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
26210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
26220 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
26230 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
26240 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
26250 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
26260 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
26270 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
26280 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
26290 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
262a0 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
262b0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
262c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
262d0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
262e0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
262f0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
26300 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
26310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26320 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
26330 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43   code */..  /* C
26340 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
26350 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
26360 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
26370 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
26380 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
26390 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  ld), or one of t
263a0 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  he transitions t
263b0 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
263c0 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
263d0 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
263e0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
263f0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
26400 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
26410 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
26420 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
26430 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
26440 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
26450 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
26460 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  Lock==NO_LOCK &&
26470 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
26480 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c  D_LOCK).       |
26490 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
264a0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
264b0 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  && locktype==EXC
264c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
264d0 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  ;..  do {.    rc
264e0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
264f0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
26500 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
26510 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
26520 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
26530 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
26540 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
26550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26560 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61  /*.** Function a
26570 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26580 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20  straint(pPager) 
26590 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20  checks that one 
265a0 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
265b0 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72  wing is true for
265c0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
265d0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
265e0 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a  e page-cache:.**
265f0 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67  .**   a) The pag
26600 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
26610 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
26620 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
26630 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65  e .**      curre
26640 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  nt database imag
26650 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a  e, in pages, OR.
26660 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68  **.**   b) if th
26670 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  e page content w
26680 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74  ere written at t
26690 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75  his time, it wou
266a0 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62  ld not.**      b
266b0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  e necessary to w
266c0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
266d0 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20   content out to 
266e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
266f0 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65  **      (as dete
26700 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69  rmined by functi
26710 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  on subjRequiresP
26720 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  age())..**.** If
26730 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61   the condition a
26740 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20  sserted by this 
26750 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f  function were no
26760 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a  t true, and the.
26770 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65  ** dirty page we
26780 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  re to be discard
26790 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
267a0 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53  e via the pagerS
267b0 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69  tress().** routi
267c0 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28  ne, pagerStress(
267d0 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) would not writ
267e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
267f0 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a  ge content to.**
26800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26810 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69  le. If a savepoi
26820 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
26830 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ere rolled back 
26840 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61  after.** this ha
26850 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72  ppened, the corr
26860 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75  ect behavior wou
26870 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
26880 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
26890 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
268a0 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
268b0 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
268c0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
268d0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
268e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
268f0 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
26900 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
26910 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
26920 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
26930 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
26940 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
26950 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
26960 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
26970 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
26980 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
26990 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
269a0 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
269b0 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
269c0 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
269d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
269e0 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
269f0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
26a00 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
26a10 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
26a20 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
26a30 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
26a40 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
26a50 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
26a60 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
26a70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
26a80 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
26a90 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
26aa0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
26ab0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
26ac0 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
26ad0 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
26ae0 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
26af0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26b00 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
26b10 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
26b20 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26b30 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
26b40 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
26b50 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
26b60 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
26b70 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
26b80 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
26b90 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
26ba0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
26bb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
26bc0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
26bd0 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
26be0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
26bf0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
26c00 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
26c10 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
26c20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
26c30 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
26c40 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
26c50 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
26c60 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
26c70 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
26c80 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
26c90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
26ca0 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69  Once this functi
26cb0 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  on has been call
26cc0 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ed, the transact
26cd0 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20  ion must either 
26ce0 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  be.** rolled bac
26cf0 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20  k or committed. 
26d00 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
26d10 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
26d20 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e  tion and.** then
26d30 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e   continue writin
26d40 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
26d50 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
26d60 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
26d70 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
26d80 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
26d90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26da0 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
26db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26dc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
26dd0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
26de0 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
26df0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
26e00 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  ..  /* At one po
26e10 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  int the code her
26e20 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54  e called assertT
26e30 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26e40 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75  t() to.  ** ensu
26e50 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  re that all page
26e60 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65  s being truncate
26e70 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f  d away by this o
26e80 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20  peration are,.  
26e90 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** if one or mor
26ea0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
26eb0 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69   open, present i
26ec0 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
26ed0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f  .  ** journal so
26ee0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
26ef0 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68  e restored if th
26f00 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72  e savepoint is r
26f10 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
26f20 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67   This is no long
26f30 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  er necessary as 
26f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26f50 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63   now only.  ** c
26f60 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
26f70 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
26f80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
26f90 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20  although the .  
26fa0 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ** Pager object 
26fb0 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f  may still have o
26fc0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28  pen savepoints (
26fd0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
26fe0 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79  !=0), .  ** they
26ff0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
27000 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61  d back. So the a
27010 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
27020 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20  straint() call. 
27030 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   ** is no longer
27040 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a   correct. */.}..
27050 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
27060 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
27070 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
27080 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
27090 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
270a0 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
270b0 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
270c0 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
270d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
270e0 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
270f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
27100 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
27110 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
27120 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
27130 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
27140 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
27150 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
27160 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
27170 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
27180 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
27190 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
271a0 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
271b0 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
271c0 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
271d0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
271e0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
271f0 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
27200 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
27210 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
27220 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
27230 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
27240 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
27250 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
27260 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
27270 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
27280 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
27290 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
272a0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
272b0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
272c0 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
272d0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
272e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
272f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
27300 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
27310 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
27320 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
27330 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
27340 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
27350 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
27360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
27370 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
27380 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
27390 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
273a0 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
273b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53  urn rc;.}..#if S
273c0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
273d0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  IZE>0./*.** Obta
273e0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
273f0 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  o a memory mappe
27400 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f  d page object fo
27410 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  r page number pg
27420 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20  no. .** The new 
27430 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20  object will use 
27440 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74  the pointer pDat
27450 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  a, obtained from
27460 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66   xFetch()..** If
27470 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
27480 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e   *ppPage to poin
27490 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
274a0 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61  e reference.** a
274b0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
274c0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
274d0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
274e0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
274f0 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74  set.** *ppPage t
27500 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61  o zero..**.** Pa
27510 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62  ge references ob
27520 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
27530 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
27540 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73  should be releas
27550 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ed.** by calling
27560 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27570 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
27580 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
27590 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67  reMapPage(.  Pag
275a0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
275b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275c0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
275d0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275f0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
27600 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
27610 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
27620 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28        /* xFetch(
27630 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69  )'d data for thi
27640 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
27650 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20  r **ppPage      
27660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27670 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67  UT: Acquired pag
27680 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
27690 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
276c0 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e  d page to return
276d0 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61   */.  .  if( pPa
276e0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
276f0 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
27700 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
27710 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
27720 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
27730 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
27740 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
27750 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  rty = 0;.    ass
27760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45 78  ert( pPager->nEx
27770 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65  tra>=8 );.    me
27780 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20  mset(p->pExtra, 
27790 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 8);.  }else{.
277a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
277b0 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74  = (PgHdr *)sqlit
277c0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
277d0 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61  eof(PgHdr) + pPa
277e0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
277f0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
27800 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
27810 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
27820 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
27830 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27840 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
27850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27860 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
27870 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d  .    p->pExtra =
27880 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a   (void *)&p[1];.
27890 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50      p->flags = P
278a0 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70  GHDR_MMAP;.    p
278b0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
278c0 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  p->pPager = pPag
278d0 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  er;.  }..  asser
278e0 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76  t( p->pExtra==(v
278f0 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20  oid *)&p[1] );. 
27900 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
27910 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
27920 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44  ( p->flags==PGHD
27930 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65  R_MMAP );.  asse
27940 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70  rt( p->pPager==p
27950 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
27960 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  t( p->nRef==1 );
27970 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67  ..  p->pgno = pg
27980 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d  no;.  p->pData =
27990 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72   pData;.  pPager
279a0 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20  ->nMmapOut++;.. 
279b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
279c0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
279d0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
279e0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
279f0 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
27a00 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
27a10 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
27a20 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
27a30 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
27a40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27a50 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
27a60 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
27a70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
27a80 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
27a90 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
27aa0 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
27ab0 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
27ac0 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
27ad0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27ae0 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
27af0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
27b00 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
27b10 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  sq
27b20 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
27b30 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
27b40 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
27b50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
27b60 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
27b70 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
27b80 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
27b90 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
27ba0 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
27bb0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
27bc0 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
27bd0 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
27be0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
27bf0 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
27c00 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
27c10 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
27c20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
27c30 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
27c40 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
27c50 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
27c60 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
27c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27c80 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
27c90 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
27ca0 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
27cb0 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
27cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
27cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
27ce0 20 73 74 69 6c 6c 20 77 68 65 72 65 20 69 74 20   still where it 
27cf0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f  ought.** to be o
27d00 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  n disk.  Return 
27d10 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45  non-zero (SQLITE
27d20 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
27d30 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  D or some other 
27d40 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72  error.** code fr
27d50 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  om sqlite3OsAcce
27d60 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74  ss()) if the dat
27d70 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d  abase has gone m
27d80 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  issing..*/.stati
27d90 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73  c int databaseIs
27da0 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70  Unmoved(Pager *p
27db0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48  Pager){.  int bH
27dc0 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69  asMoved = 0;.  i
27dd0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
27de0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
27df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27e00 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
27e10 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74  >dbSize==0 ) ret
27e20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27e30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27e40 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50  >zFilename && pP
27e50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
27e60 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  0] );.  rc = sql
27e70 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
27e80 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
27e90 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
27ea0 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64  OVED, &bHasMoved
27eb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27ec0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
27ed0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41      /* If the HA
27ee0 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e  S_MOVED file-con
27ef0 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d  trol is unimplem
27f00 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ented, assume th
27f10 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  at the file.    
27f20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
27f30 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20  moved.  That is 
27f40 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62  the historical b
27f50 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74  ehavior of SQLit
27f60 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  e: prior to.    
27f70 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33  ** version 3.8.3
27f80 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b  , it never check
27f90 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ed */.    rc = S
27fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
27fb0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
27fc0 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64  _OK && bHasMoved
27fd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
27fe0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
27ff0 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OVED;.  }.  retu
28000 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
28010 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
28020 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
28030 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
28040 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
28050 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
28060 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
28070 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
28080 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
28090 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
280a0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
280b0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
280c0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
280d0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
280e0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
280f0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
28100 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
28110 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
28120 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
28130 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
28140 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
28150 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
28160 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
28170 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
28180 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28190 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
281a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
281b0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
281c0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
281d0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
281e0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
281f0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
28200 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
28210 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
28220 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
28230 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
28240 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
28250 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
28260 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
28270 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
28280 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
28290 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20  ite3 *db){.  u8 
282a0 2a 70 54 6d 70 20 3d 20 28 75 38 2a 29 70 50 61  *pTmp = (u8*)pPa
282b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
282c0 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20    assert( db || 
282d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
282e0 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
282f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
28300 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
28310 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
28320 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
28330 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
28340 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
28350 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
28360 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
28370 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
28380 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
28390 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
283a0 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
283b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
283c0 20 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 30   {.    u8 *a = 0
283d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
283e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61 6c   || pPager->pWal
283f0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ==0 );.    if( d
28400 62 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66 6c 61  b && 0==(db->fla
28410 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b  gs & SQLITE_NoCk
28420 70 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20 20 20  ptOnClose) .    
28430 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 64   && SQLITE_OK==d
28440 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
28450 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b 0a  (pPager).    ){.
28460 20 20 20 20 20 20 61 20 3d 20 70 54 6d 70 3b 0a        a = pTmp;.
28470 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28480 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
28490 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61 67  ->pWal, db, pPag
284a0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
284b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
284c0 7a 65 2c 61 29 3b 0a 20 20 20 20 70 50 61 67 65  ze,a);.    pPage
284d0 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20 7d  r->pWal = 0;.  }
284e0 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
284f0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
28500 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
28510 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
28520 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
28530 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
28540 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
28550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
28560 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
28570 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
28580 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
28590 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
285a0 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
285b0 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
285c0 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
285d0 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
285e0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
285f0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
28600 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
28610 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
28620 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
28630 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
28640 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
28650 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
28660 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
28670 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
28680 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
28690 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
286a0 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
286b0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
286c0 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
286d0 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
286e0 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
286f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
28700 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
28710 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28720 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
28730 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
28740 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
28750 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
28760 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
28770 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
28780 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
28790 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
287a0 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
287b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
287c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
287d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
287e0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
287f0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
28800 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
28810 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
28820 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
28830 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
28840 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
28850 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
28860 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
28870 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
28880 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
28890 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
288a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
288b0 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
288c0 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
288d0 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
288e0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
288f0 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
28900 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
28910 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
28920 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
28930 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
28940 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
28950 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
28960 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
28970 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
28980 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
28990 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
289a0 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
289b0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
289c0 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
289d0 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
289e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
289f0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
28a00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
28a10 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
28a20 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
28a30 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
28a40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
28a50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
28a60 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
28a70 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
28a80 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
28a90 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
28aa0 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
28ab0 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
28ac0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
28ad0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
28ae0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
28af0 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
28b00 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
28b10 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
28b20 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
28b30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
28b40 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
28b50 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
28b60 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
28b70 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
28b80 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
28b90 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
28ba0 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
28bb0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
28bc0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
28bd0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
28be0 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
28bf0 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
28c00 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
28c10 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
28c20 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
28c30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
28c40 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
28c50 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
28c60 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
28c70 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
28c80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
28c90 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
28ca0 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
28cb0 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
28cc0 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
28cd0 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
28ce0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
28cf0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
28d00 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
28d10 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a  .**   * If the j
28d20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
28d30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
28d40 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74  nal file, no act
28d50 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  ion need.**     
28d60 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  be taken..**.** 
28d70 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69    * Otherwise, i
28d80 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
28d90 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
28da0 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  e SAFE_APPEND pr
28db0 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74  operty,.**     t
28dc0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
28dd0 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ld of the most r
28de0 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20  ecently written 
28df0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
28e00 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64  *     is updated
28e10 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
28e20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61  number of journa
28e30 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68  l records that h
28e40 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  ave.**     been 
28e50 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e  written followin
28e60 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67  g it. If the pag
28e70 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  er is operating 
28e80 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20  in full-sync.** 
28e90 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74      mode, then t
28ea0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28eb0 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65  is synced before
28ec0 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75   this field is u
28ed0 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
28ee0 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20  * If the device 
28ef0 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
28f00 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20   the SEQUENTIAL 
28f10 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a  property, then .
28f20 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66  **     journal f
28f30 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
28f40 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75  *.** Or, in pseu
28f50 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  do-code:.**.**  
28f60 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d   if( NOT <in-mem
28f70 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a  ory journal> ){.
28f80 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
28f90 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a  AFE_APPEND ){.**
28fa0 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c         if( <full
28fb0 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53  -sync mode> ) xS
28fc0 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
28fd0 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75  e>);.**       <u
28fe0 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64  pdate nRec field
28ff0 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20  >.**     } .**  
29000 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45     if( NOT SEQUE
29010 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a  NTIAL ) xSync(<j
29020 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
29030 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73  *   }.**.** If s
29040 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
29050 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
29060 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
29070 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
29080 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
29090 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
290a0 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
290b0 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
290c0 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
290d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
290e0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
290f0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
29100 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
29110 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29120 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
29130 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
29140 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72  newHdr){.  int r
29150 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
29160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29170 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
29180 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29190 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
291a0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
291b0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
291c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
291d0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
291e0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
291f0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
29200 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
29210 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
29220 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  Pager) );..  rc 
29230 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
29240 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67  clusiveLock(pPag
29250 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
29260 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29270 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  n rc;..  if( !pP
29280 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
29290 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
292a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
292b0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
292c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
292d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
292e0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
292f0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
29300 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
29310 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
29320 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
29330 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
29340 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29350 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
29360 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
29370 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
29380 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
29390 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
293a0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
293b0 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
293c0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
293d0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
293e0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
293f0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
29400 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
29410 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
29420 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
29430 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
29440 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
29450 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
29460 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
29470 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
29480 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
29490 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
294a0 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
294b0 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
294c0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
294d0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
294e0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
294f0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
29500 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
29510 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
29520 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
29530 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
29540 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
29550 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
29560 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
29570 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
29580 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
29590 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
295a0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
295b0 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
295c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
295d0 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
295e0 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
295f0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
29600 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
29610 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
29620 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
29630 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
29640 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
29650 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
29660 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
29670 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
29680 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
29690 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
296a0 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
296b0 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
296c0 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
296d0 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
296e0 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
296f0 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
29700 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
29710 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29720 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
29730 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
29740 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
29750 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
29760 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
29770 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
29780 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
29790 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
297a0 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
297b0 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
297c0 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
297d0 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
297e0 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
297f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29800 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
29810 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
29820 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
29830 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
29840 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
29850 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
29860 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
29870 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
29880 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
29890 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
298a0 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
298b0 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
298c0 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
298d0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
298e0 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
298f0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
29900 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
29910 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
29920 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
29930 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
29940 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
29950 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
29960 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
29970 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
29980 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
29990 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
299a0 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
299b0 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
299c0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
299d0 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
299e0 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
299f0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
29a00 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
29a10 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
29a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29a30 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
29a40 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
29a50 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
29a60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29a70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
29a80 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
29a90 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
29aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
29ab0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
29ac0 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
29ad0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29ae0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
29af0 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
29b00 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
29b10 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
29b20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29b30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
29b40 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
29b50 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
29b60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29b70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
29b80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
29b90 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
29ba0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29bb0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
29bc0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
29bd0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
29be0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
29bf0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
29c00 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
29c10 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
29c20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
29c30 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
29c40 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
29c50 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
29c60 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
29c70 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
29c80 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29c90 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
29ca0 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
29cb0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
29cc0 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
29cd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
29ce0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
29cf0 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
29d00 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
29d10 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
29d20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
29d30 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
29d40 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
29d50 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
29d60 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
29d70 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
29d80 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
29d90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
29da0 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
29db0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
29dc0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
29dd0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
29de0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
29df0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
29e00 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
29e10 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
29e20 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
29e30 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
29e40 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
29e50 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
29e60 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
29e70 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
29e80 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
29e90 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
29ea0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
29eb0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
29ec0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
29ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29ef0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
29f00 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
29f10 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
29f20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
29f30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
29f40 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
29f50 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
29f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
29f70 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
29f80 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
29f90 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
29fa0 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
29fb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29fd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
29fe0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
29ff0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
2a000 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
2a010 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
2a020 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
2a030 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
2a040 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
2a050 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2a060 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
2a070 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
2a080 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2a090 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
2a0a0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c  ager->syncFlags|
2a0b0 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
2a0c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2a0d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
2a0e0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
2a0f0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
2a100 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2a110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a120 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2a130 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72   }..      pPager
2a140 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
2a150 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2a160 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  f;.      if( new
2a170 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53  Hdr && 0==(iDc&S
2a180 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
2a190 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
2a1a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
2a1b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2a1c0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
2a1d0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
2a1e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a1f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2a200 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2a210 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
2a220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
2a230 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a240 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
2a250 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    /* Unless the 
2a260 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79  pager is in noSy
2a270 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
2a280 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
2a290 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  st .  ** success
2a2a0 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69  fully synced. Ei
2a2b0 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20  ther way, clear 
2a2c0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
2a2d0 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a  YNC flag on .  *
2a2e0 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a  * all pages..  *
2a2f0 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
2a300 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
2a310 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2a320 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
2a330 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
2a340 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72  R_DBMOD;.  asser
2a350 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2a360 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2a370 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a380 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
2a390 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
2a3a0 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
2a3b0 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
2a3c0 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
2a3d0 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
2a3e0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
2a3f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2a400 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
2a410 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
2a420 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
2a430 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
2a440 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2a450 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
2a460 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
2a470 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
2a480 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
2a490 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
2a4a0 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
2a4b0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
2a4c0 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
2a4d0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
2a4e0 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
2a4f0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
2a500 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
2a510 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
2a520 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2a530 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
2a540 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
2a550 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
2a560 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
2a570 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
2a580 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
2a590 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
2a5a0 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
2a5b0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
2a5c0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
2a5d0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
2a5e0 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
2a5f0 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
2a600 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
2a610 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
2a620 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
2a630 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
2a640 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
2a650 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
2a660 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
2a670 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
2a680 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
2a690 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
2a6a0 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
2a6b0 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
2a6c0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
2a6d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
2a6e0 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
2a6f0 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
2a700 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
2a710 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
2a720 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
2a730 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
2a740 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
2a750 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
2a760 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
2a770 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
2a780 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
2a790 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
2a7a0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
2a7b0 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
2a7c0 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
2a7d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2a7e0 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
2a7f0 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
2a800 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
2a810 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
2a820 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
2a830 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
2a840 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
2a850 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
2a860 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
2a870 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
2a880 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
2a890 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
2a8a0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
2a8b0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2a8c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2a8d0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2a8e0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
2a8f0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
2a900 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2a910 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
2a920 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
2a930 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
2a940 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
2a950 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2a960 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
2a970 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67  ite_pagelist(Pag
2a980 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
2a990 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  r *pList){.  int
2a9a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a9d0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
2a9e0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
2a9f0 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62  called for rollb
2aa00 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52  ack pagers in WR
2aa10 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65  ITER_DBMOD state
2aa20 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  . */.  assert( !
2aa30 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2aa40 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
2aa50 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2aa60 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
2aa70 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2aa80 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
2aa90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
2aaa0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
2aab0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2aac0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2aad0 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69  d) || pList->pDi
2aae0 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
2aaf0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
2ab00 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
2ab10 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
2ab20 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
2ab30 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
2ab40 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
2ab50 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
2ab60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2ab70 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
2ab80 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
2ab90 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
2aba0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2abb0 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
2abc0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2abd0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
2abe0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2abf0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
2ac00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2ac10 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
2ac20 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
2ac30 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2ac40 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
2ac50 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
2ac60 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
2ac70 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
2ac80 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
2ac90 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
2aca0 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
2acb0 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
2acc0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2acd0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2ace0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2acf0 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50  ITE_OK .   && pP
2ad00 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2ad10 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a  <pPager->dbSize.
2ad20 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44     && (pList->pD
2ad30 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  irty || pList->p
2ad40 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69  gno>pPager->dbHi
2ad50 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  ntSize).  ){.   
2ad60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
2ad70 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
2ad80 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
2ad90 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
2ada0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
2adb0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2adc0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
2add0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
2ade0 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
2adf0 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
2ae00 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
2ae10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2ae20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
2ae30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2ae40 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
2ae50 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
2ae60 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
2ae70 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
2ae80 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
2ae90 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
2aea0 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
2aeb0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
2aec0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
2aed0 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
2aee0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
2aef0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
2af00 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
2af10 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
2af20 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
2af30 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
2af40 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
2af50 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
2af60 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
2af70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
2af80 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
2af90 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
2afa0 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
2afb0 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
2afc0 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
2afd0 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
2afe0 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
2aff0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
2b000 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
2b010 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
2b020 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
2b030 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
2b040 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
2b050 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
2b060 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
2b070 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
2b080 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
2b090 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2b0c0 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
2b0d0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2b0e0 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2b0f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2b100 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2b110 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
2b120 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
2b130 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
2b140 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
2b150 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
2b160 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
2b170 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
2b180 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
2b190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b1a0 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b  EM_BKPT, pData);
2b1b0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
2b1c0 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
2b1d0 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
2b1e0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2b1f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
2b200 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
2b210 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
2b220 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
2b230 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
2b240 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
2b250 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
2b260 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
2b270 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
2b280 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
2b290 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
2b2a0 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
2b2b0 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
2b2c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b2d0 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
2b2e0 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
2b2f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2b300 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
2b310 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b320 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
2b330 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
2b340 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2b350 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
2b360 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
2b370 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
2b380 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
2b390 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2b3a0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
2b3b0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2b3c0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
2b3d0 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
2b3e0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
2b3f0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
2b400 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
2b410 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
2b420 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
2b430 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
2b440 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
2b450 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
2b460 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
2b470 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2b480 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
2b490 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2b4c0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
2b4d0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
2b4e0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
2b4f0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
2b500 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
2b510 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
2b520 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
2b530 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
2b540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b550 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
2b560 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
2b570 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2b580 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
2b590 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
2b5a0 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
2b5b0 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
2b5c0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2b5d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2b5e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
2b5f0 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
2b600 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2b610 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
2b620 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
2b630 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
2b640 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
2b650 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b660 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
2b670 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
2b680 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
2b690 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
2b6a0 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
2b6b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
2b6c0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2b6d0 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
2b6e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b6f0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
2b700 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2b710 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b720 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2b730 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2b740 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
2b750 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54  t flags =  SQLIT
2b760 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2b770 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
2b780 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20  READWRITE .     
2b790 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
2b7a0 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
2b7b0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20  PEN_EXCLUSIVE . 
2b7c0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
2b7d0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2b7e0 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53  ;.    int nStmtS
2b7f0 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
2b800 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
2b810 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2b820 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2b830 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b840 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
2b850 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
2b860 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69  {.      nStmtSpi
2b870 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ll = -1;.    }. 
2b880 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2b890 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
2b8a0 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67  r->pVfs, 0, pPag
2b8b0 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c  er->sjfd, flags,
2b8c0 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20   nStmtSpill);.  
2b8d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b8e0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
2b8f0 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
2b900 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
2b910 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
2b920 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
2b930 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2b940 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2b950 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2b960 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2b970 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2b980 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2b990 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2b9a0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2b9b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2b9c0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2b9d0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2b9e0 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2b9f0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2ba00 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2ba10 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2ba20 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2ba30 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2ba40 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2ba50 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2ba60 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2ba70 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2ba80 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2ba90 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2baa0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2bab0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bac0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2bad0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2bae0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2baf0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2bb00 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2bb10 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2bb20 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2bb30 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2bb40 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2bb50 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2bb60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2bb70 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2bb80 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2bb90 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2bba0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bbb0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2bbc0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2bbd0 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2bbe0 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2bbf0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2bc00 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2bc10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2bc20 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2bc30 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2bc40 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2bc50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2bc60 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2bc70 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2bc80 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2bc90 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2bca0 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2bcb0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2bcc0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2bcd0 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2bce0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2bcf0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2bd00 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2bd10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bd20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2bd30 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2bd40 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2bd50 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2bd60 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2bd70 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2bd80 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2bd90 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  ;..#if SQLITE_HA
2bda0 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20  S_CODEC   .     
2bdb0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75   if( !pPager->su
2bdc0 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
2bdd0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2bde0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
2bdf0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
2be00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2be10 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  PT, pData2);.   
2be20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2be30 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 70        pData2 = p
2be40 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45  Data;.      PAGE
2be50 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
2be60 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
2be70 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2be80 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2be90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
2bea0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
2beb0 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
2bec0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2bed0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2bef0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2bf00 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
2bf10 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
2bf20 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
2bf30 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
2bf40 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2bf50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bf60 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
2bf70 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ec++;.    assert
2bf80 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2bf90 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63  oint>0 );.    rc
2bfa0 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   = addToSavepoin
2bfb0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
2bfc0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
2bfd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bfe0 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
2bff0 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2c000 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b  red(PgHdr *pPg){
2c010 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69  .  if( subjRequi
2c020 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
2c030 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f      return subjo
2c040 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2c050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2c060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c070 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2c080 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2c090 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
2c0a0 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
2c0b0 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
2c0c0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
2c0d0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
2c0e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
2c0f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
2c100 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
2c110 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
2c120 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
2c130 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
2c140 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
2c150 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
2c160 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2c170 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
2c180 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
2c190 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
2c1a0 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
2c1b0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2c1c0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
2c1d0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
2c1e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c1f0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
2c200 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2c210 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
2c220 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
2c230 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
2c240 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
2c250 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
2c260 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
2c270 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2c280 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
2c290 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
2c2a0 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
2c2b0 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
2c2c0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
2c2d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
2c2e0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2c2f0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
2c300 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
2c310 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2c320 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2c330 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2c340 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
2c350 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
2c360 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
2c370 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2c380 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
2c390 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
2c3a0 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
2c3b0 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
2c3c0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
2c3d0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2c3e0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2c3f0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
2c400 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2c410 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
2c420 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2c430 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
2c440 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
2c450 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2c460 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
2c470 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c480 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
2c490 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2c4a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2c4b0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2c4c0 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
2c4d0 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
2c4e0 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64  YNC bit is set d
2c4f0 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
2c500 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
2c510 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
2c520 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
2c530 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
2c540 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
2c550 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
2c560 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2c570 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
2c580 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
2c590 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
2c5a0 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
2c5b0 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
2c5c0 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
2c5d0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2c5e0 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46   ROLLBACK and OF
2c5f0 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20  F bits inhibits 
2c600 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69  all cache spilli
2c610 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65  ng.  ** regardle
2c620 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2c630 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72   not a sync is r
2c640 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69  equired.  This i
2c650 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a  s set during.  *
2c660 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  * a rollback or 
2c670 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c  by user request,
2c680 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
2c690 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
2c6a0 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
2c6b0 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
2c6c0 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
2c6d0 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
2c6e0 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
2c6f0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
2c700 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
2c710 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2c720 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
2c730 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
2c740 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
2c750 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
2c760 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20   createFlag==3. 
2c770 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
2c780 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
2c790 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
2c7a0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
2c7b0 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
2c7c0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
2c7d0 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
2c7e0 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
2c7f0 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
2c800 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
2c810 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
2c820 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
2c830 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
2c840 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
2c850 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2c860 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2c870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73  SQLITE_OK;.  tes
2c880 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2c890 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2c8a0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29  LFLAG_ROLLBACK )
2c8b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2c8c0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2c8d0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46   & SPILLFLAG_OFF
2c8e0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2c8f0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2c900 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  ll & SPILLFLAG_N
2c910 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70  OSYNC );.  if( p
2c920 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2c930 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72  l.   && ((pPager
2c940 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28  ->doNotSpill & (
2c950 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2c960 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  CK|SPILLFLAG_OFF
2c970 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28  ))!=0.      || (
2c980 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
2c990 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
2c9a0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2c9b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2c9c0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  ..  pPager->aSta
2c9d0 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 53 50 49  t[PAGER_STAT_SPI
2c9e0 4c 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e 70 44  LL]++;.  pPg->pD
2c9f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2ca00 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2ca10 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2ca20 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2ca30 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2ca40 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2ca50 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2ca60 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2ca70 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28  d(pPg); .    if(
2ca80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ca90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2caa0 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2cab0 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2cac0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2cad0 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
2cae0 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
2caf0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2cb00 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
2cb10 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2cb20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
2cb30 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65  rnalCreate(pPage
2cb40 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
2cb50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cb60 20 29 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f   ) return pager_
2cb70 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2cb80 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2cb90 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
2cba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2cbb0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2cbc0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
2cbd0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2cbe0 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
2cbf0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2cc00 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
2cc10 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
2cc20 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
2cc30 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2cc40 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
2cc50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2cc60 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
2cc70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2cc80 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
2cc90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cca0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2ccb0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2ccc0 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2ccd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2cce0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2ccf0 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  t(pPager, pPg);.
2cd00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2cd10 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
2cd20 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
2cd30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cd40 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
2cd50 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
2cd60 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2cd70 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2cd80 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
2cd90 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2cda0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
2cdb0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2cdc0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a  r(pPager, rc); .
2cdd0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
2cde0 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ll unreferenced 
2cdf0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64  dirty pages to d
2ce00 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
2ce10 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61  te3PagerFlush(Pa
2ce20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ce30 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
2ce40 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
2ce50 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67  !MEMDB ){.    Pg
2ce60 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
2ce70 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2ce80 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2ce90 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  che);.    assert
2cea0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2ceb0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2cec0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2ced0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
2cee0 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  t ){.      PgHdr
2cef0 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
2cf00 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69  >pDirty;.      i
2cf10 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d  f( pList->nRef==
2cf20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2cf30 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76  = pagerStress((v
2cf40 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  oid*)pPager, pLi
2cf50 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2cf60 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
2cf70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2cf80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2cf90 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2cfa0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2cfb0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2cfc0 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2cfd0 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2cfe0 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2cff0 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2d000 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2d010 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2d020 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2d030 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2d040 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2d050 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2d060 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d070 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2d080 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2d090 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2d0a0 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2d0b0 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2d0c0 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2d0d0 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2d0e0 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2d0f0 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2d100 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2d110 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2d120 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2d130 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2d140 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2d150 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2d160 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2d170 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2d180 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2d190 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2d1a0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2d1b0 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2d1c0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2d1d0 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2d1e0 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2d1f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2d200 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2d210 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2d220 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2d230 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2d240 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2d250 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2d260 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2d270 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2d280 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65 77  API.  When a new
2d290 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
2d2a0 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ed, the.** first
2d2b0 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 69 73   8 bytes of this
2d2c0 20 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f 65   space are zeroe
2d2d0 64 20 62 75 74 20 74 68 65 20 72 65 6d 61 69 6e  d but the remain
2d2e0 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  der is uninitial
2d2f0 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78  ized..** (The ex
2d300 74 72 61 20 73 70 61 63 65 20 69 73 20 75 73 65  tra space is use
2d310 64 20 62 79 20 62 74 72 65 65 20 61 73 20 74 68  d by btree as th
2d320 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
2d330 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  .).**.** The fla
2d340 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
2d350 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
2d360 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
2d370 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
2d380 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
2d390 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
2d3a0 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
2d3b0 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
2d3c0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
2d3d0 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  R_* flags..**.**
2d3e0 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
2d3f0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
2d400 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
2d410 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2d420 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
2d430 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
2d440 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
2d450 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
2d460 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
2d470 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
2d480 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
2d490 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
2d4a0 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
2d4b0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
2d4c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2d4d0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
2d4e0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
2d4f0 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
2d500 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
2d510 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
2d520 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
2d530 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
2d540 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
2d550 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
2d560 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
2d570 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
2d580 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
2d590 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
2d5a0 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
2d5b0 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
2d5c0 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
2d5d0 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
2d5e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2d5f0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
2d600 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2d610 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2d620 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
2d630 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
2d640 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
2d650 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
2d660 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2d670 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2d680 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2d690 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
2d6a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2d6b0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
2d6c0 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
2d6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2d6e0 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
2d6f0 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2d700 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2d710 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2d720 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
2d730 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
2d740 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
2d750 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
2d760 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
2d770 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
2d780 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
2d790 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
2d7a0 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
2d7b0 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
2d7c0 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
2d7d0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
2d7e0 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
2d7f0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
2d800 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
2d810 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
2d820 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
2d830 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2d840 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2d850 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
2d860 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
2d870 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
2d880 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
2d890 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
2d8a0 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
2d8b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2d8c0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2d8d0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
2d8e0 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e */.#ifdef SQLI
2d8f0 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
2d900 41 4c 49 5a 45 0a 20 20 69 6e 74 20 6d 65 6d 4a  ALIZE.  int memJ
2d910 4d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  M = 0;          
2d920 20 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75 72 6e   /* Memory journ
2d930 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65 6c 73 65  al mode */.#else
2d940 0a 23 20 64 65 66 69 6e 65 20 6d 65 6d 4a 4d 20  .# define memJM 
2d950 30 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72  0.#endif.  int r
2d960 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
2d970 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2d980 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
2d990 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
2d9a0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d9b0 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
2d9c0 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
2d9d0 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
2d9e0 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
2d9f0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
2da00 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
2da10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2da20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
2da30 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
2da40 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
2da50 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
2da60 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
2da70 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
2da80 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
2da90 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
2daa0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
2dab0 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
2dac0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2dad0 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74  ();       /* Byt
2dae0 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2daf0 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75  or PCache */.  u
2db00 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20  32 szPageDflt = 
2db10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2db20 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65  AGE_SIZE;  /* De
2db30 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2db40 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2db50 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a  *zUri = 0;    /*
2db60 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70   URI args to cop
2db70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20  y */.  int nUri 
2db80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2db90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2dba0 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61  es of URI args a
2dbb0 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a  t *zUri */..  /*
2dbc0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
2dbd0 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
2dbe0 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
2dbf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2dc00 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
2dc10 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
2dc20 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
2dc30 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
2dc40 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f  urnal).  */.  jo
2dc50 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2dc60 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
2dc70 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
2dc80 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
2dc90 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
2dca0 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
2dcb0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
2dcc0 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
2dcd0 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   0;..#ifndef SQL
2dce0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
2dcf0 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  B.  if( flags & 
2dd00 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a  PAGER_MEMORY ){.
2dd10 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
2dd20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
2dd30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2dd40 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   ){.      zPathn
2dd50 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
2dd60 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61  trDup(0, zFilena
2dd70 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
2dd80 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72  Pathname==0  ) r
2dd90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2dda0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e  EM_BKPT;.      n
2ddb0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2ddc0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2ddd0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69  name);.      zFi
2dde0 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
2ddf0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2de00 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2de10 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2de20 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2de30 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2de40 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2de50 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2de60 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2de70 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2de80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2de90 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2dea0 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2deb0 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2dec0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2ded0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2dee0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2def0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2df00 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2df10 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2df20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2df30 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2df40 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a  aw(0, nPathname*
2df50 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
2df60 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
2df70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2df80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2df90 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b  }.    zPathname[
2dfa0 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
2dfb0 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
2dfc0 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
2dfd0 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
2dfe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2dff0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
2e000 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2e010 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
2e020 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74  hname);.    nPat
2e030 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2e040 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2e050 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69  e);.    z = zUri
2e060 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71   = &zFilename[sq
2e070 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
2e080 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20  ilename)+1];.   
2e090 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2e0a0 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2e0b0 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2e0c0 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2e0d0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2e0e0 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d      }.    nUri =
2e0f0 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a   (int)(&z[1] - z
2e100 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Uri);.    assert
2e110 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20  ( nUri>=0 );.   
2e120 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e130 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
2e140 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
2e150 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
2e160 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2e170 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
2e180 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
2e190 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
2e1a0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
2e1b0 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
2e1c0 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
2e1d0 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
2e1e0 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
2e1f0 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
2e200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
2e210 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
2e220 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
2e230 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
2e240 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
2e250 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2e260 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
2e270 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
2e280 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
2e290 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
2e2a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2e2b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2e2c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2e2d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e2e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2e2f0 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2e300 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2e310 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2e320 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2e330 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2e340 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2e350 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2e360 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2e370 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2e380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2e390 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2e3a0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2e3b0 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2e3c0 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2e3d0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2e3e0 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2e3f0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2e400 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2e410 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2e420 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2e430 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2e440 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2e450 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2e460 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2e470 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2e480 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2e490 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2e4a0 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2e4b0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2e4c0 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2e4d0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2e4e0 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2e4f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2e500 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2e510 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2e520 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2e530 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2e540 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2e550 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2e560 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2e570 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2e580 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2e590 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2e5a0 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2e5b0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2e5c0 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2e5d0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2e5e0 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2e5f0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2e600 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2e610 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2e620 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2e630 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2e640 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2e650 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2e660 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2e670 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2e680 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2e690 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2e6a0 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2e6b0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2e6c0 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2e6d0 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2e6e0 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2e6f0 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2e700 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2e710 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2e720 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2e730 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2e740 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2e750 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2e760 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2e770 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2e780 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2e790 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2e7a0 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2e7b0 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2e7c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2e7d0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2e7e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e7f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
2e800 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
2e810 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
2e820 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
2e830 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
2e840 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
2e850 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2e860 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2e870 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2e880 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2e890 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2e8a0 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2e8b0 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2e8c0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2e8d0 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2e8e0 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2e8f0 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2e900 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2e910 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2e920 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2e930 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2e940 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2e950 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2e960 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2e970 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2e980 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2e990 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2e9a0 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2e9b0 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2e9c0 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2e9d0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2e9e0 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2e9f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74      assert( nPat
2ea00 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70  hname>0 );.    p
2ea10 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2ea20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2ea30 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2ea40 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  1 + nUri);.    m
2ea50 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
2ea60 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
2ea70 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2ea80 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d      if( nUri ) m
2ea90 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2eaa0 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
2eab0 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72  me+1], zUri, nUr
2eac0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2ead0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2eae0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2eaf0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2eb00 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
2eb10 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
2eb20 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c   "-journal\000",
2eb30 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74   8+2);.    sqlit
2eb40 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2eb50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2eb60 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2eb70 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2eb80 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2eb90 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26  pPager->zWal = &
2eba0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ebb0 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b  [nPathname+8+1];
2ebc0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2ebd0 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e  er->zWal, zPathn
2ebe0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2ebf0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2ec00 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e  ger->zWal[nPathn
2ec10 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22  ame], "-wal\000"
2ec20 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  , 4+1);.    sqli
2ec30 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2ec40 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2ec50 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b  , pPager->zWal);
2ec60 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
2ec70 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2ec80 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
2ec90 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
2eca0 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
2ecb0 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
2ecc0 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
2ecd0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
2ece0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2ecf0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2ed00 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f  0] ){.    int fo
2ed10 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
2ed20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
2ed30 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  S flags returned
2ed40 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   by xOpen() */. 
2ed50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2ed60 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2ed70 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2ed80 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c  Pager->fd, vfsFl
2ed90 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
2eda0 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20   assert( !memDb 
2edb0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2edc0 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
2edd0 49 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d 20 3d 20  IZE.    memJM = 
2ede0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
2edf0 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65  N_MEMORY)!=0;.#e
2ee00 6e 64 69 66 0a 20 20 20 20 72 65 61 64 4f 6e 6c  ndif.    readOnl
2ee10 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2ee20 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 21  _OPEN_READONLY)!
2ee30 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  =0;..    /* If t
2ee40 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2ee50 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2ee60 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2ee70 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2ee80 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2ee90 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2eea0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2eeb0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2eec0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2eed0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2eee0 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2eef0 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2ef00 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2ef10 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2ef20 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2ef30 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2ef40 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2ef50 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2ef60 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2ef70 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2ef80 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2ef90 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2efa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2efb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2efc0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
2efd0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2efe0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2eff0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69  er->fd);.      i
2f000 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  f( !readOnly ){.
2f010 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f          setSecto
2f020 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2f030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2f040 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2f050 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
2f060 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f070 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69  SIZE);.        i
2f080 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2f090 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2f0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2f0b0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2f0c0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2f0d0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2f0e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2f0f0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2f100 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2f110 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2f120 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f130 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2f140 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65  flt = (u32)pPage
2f150 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
2f160 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f170 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2f180 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2f190 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
2f1a0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2f1b0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
2f1c0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2f1d0 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2f1e0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
2f1f0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2f200 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2f210 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2f220 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2f230 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2f240 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
2f250 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
2f260 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2f270 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2f280 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2f290 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2f2a0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
2f2b0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
2f2c0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
2f2d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f2e0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
2f2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f300 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f310 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2f320 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2f330 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  ->noLock = sqlit
2f340 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2f350 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63  Filename, "noloc
2f360 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  k", 0);.      if
2f370 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ( (iDc & SQLITE_
2f380 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29  IOCAP_IMMUTABLE)
2f390 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  !=0.       || sq
2f3a0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2f3b0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d  n(zFilename, "im
2f3c0 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a  mutable", 0) ){.
2f3d0 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61            vfsFla
2f3e0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2f3f0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
2f400 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c        goto act_l
2f410 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20  ike_temp_file;. 
2f420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2f430 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2f440 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2f450 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
2f460 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
2f470 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2f480 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2f490 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
2f4a0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2f4b0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
2f4c0 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
2f4d0 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
2f4e0 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
2f4f0 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
2f500 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2f510 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
2f520 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
2f530 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
2f540 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
2f550 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2f560 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
2f570 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
2f580 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
2f590 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
2f5a0 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
2f5b0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
2f5c0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a  journal..    **.
2f5d0 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2f5e0 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72  ch also runs for
2f5f0 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73   files marked as
2f600 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20   immutable..    
2f610 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  */ .act_like_tem
2f620 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70  p_file:.    temp
2f630 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2f640 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2f650 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20  AGER_READER;    
2f660 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2f670 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
2f680 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  ck */.    pPager
2f690 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53  ->eLock = EXCLUS
2f6a0 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20  IVE_LOCK;    /* 
2f6b0 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69  Pretend we are i
2f6c0 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65  n EXCLUSIVE mode
2f6d0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2f6e0 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20  noLock = 1;     
2f6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2f700 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20   no locking */. 
2f710 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
2f720 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
2f730 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2f740 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
2f750 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
2f760 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2f770 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
2f780 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
2f790 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
2f7a0 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
2f7b0 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
2f7c0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2f7d0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2f7e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2f7f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
2f800 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
2f810 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2f820 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
2f830 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
2f840 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
2f850 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
2f860 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   );.  }..  /* In
2f870 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
2f880 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
2f890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f8a0 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61  OK ){.    nExtra
2f8b0 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2f8c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2f8d0 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74  Extra>=8 && nExt
2f8e0 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72  ra<1000 );.    r
2f8f0 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
2f900 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
2f910 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
2f920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f930 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2f940 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2f950 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2f960 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2f970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2f980 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2f990 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2f9a0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2f9b0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2f9c0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2f9d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f9e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2f9f0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2fa00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2fa10 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
2fa20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c  pSpace);.    sql
2fa30 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2fa40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2fa50 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2fa60 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2fa70 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2fa80 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2fa90 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2faa0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2fab0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2fac0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2fad0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2fae0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2faf0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2fb00 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2fb10 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2fb20 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2fb30 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2fb40 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2fb50 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2fb60 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2fb70 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2fb80 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2fb90 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2fba0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2fbb0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2fbc0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2fbd0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2fbe0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2fbf0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2fc00 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2fc10 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2fc20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2fc30 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2fc40 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2fc50 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2fc60 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2fc70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2fc80 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2fc90 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2fca0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2fcb0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2fcc0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2fcd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2fce0 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2fcf0 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2fd00 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2fd10 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2fd20 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2fd30 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2fd40 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2fd50 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2fd60 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2fd70 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2fd80 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2fd90 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2fda0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2fdb0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
2fdc0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2fdd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2fde0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2fdf0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2fe00 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
2fe10 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2fe20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2fe30 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2fe40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fe50 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2fe60 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2fe70 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2fe80 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
2fe90 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30  r->extraSync = 0
2fea0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
2feb0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2fec0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2fed0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
2fee0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2fef0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53  SYNC_NORMAL | (S
2ff00 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2ff10 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  L<<2);.  }.  /* 
2ff20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2ff30 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ff40 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2ff50 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ff60 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2ff70 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2ff80 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2ff90 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2ffa0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2ffb0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ffc0 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2ffd0 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2ffe0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2fff0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
30000 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
30010 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
30020 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
30030 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
30040 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
30050 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
30060 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
30070 20 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a 20 20 20   || memJM ){.   
30080 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
30090 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
300a0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
300b0 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
300c0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
300d0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
300e0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
300f0 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Arg = 0; */.  pP
30100 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
30110 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 73 65 74  = xReinit;.  set
30120 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61  GetterMethod(pPa
30130 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  ger);.  /* memse
30140 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
30150 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
30160 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
30170 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d   /* pPager->szMm
30180 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ap = SQLITE_DEFA
30190 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f  ULT_MMAP_SIZE //
301a0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20   will be set by 
301b0 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70  btree.c */..  *p
301c0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
301d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
301e0 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK;.}..../*.** 
301f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
30200 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
30210 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
30220 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
30230 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
30240 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
30250 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
30260 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
30270 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
30280 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
30290 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
302a0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
302b0 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
302c0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
302d0 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
302e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
302f0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
30300 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
30310 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
30320 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
30330 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
30340 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
30350 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
30360 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
30370 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
30380 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
30390 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
303a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
303b0 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
303c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
303d0 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
303e0 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
303f0 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
30400 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
30410 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
30420 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
30430 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
30440 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
30450 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
30460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
30470 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
30480 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
30490 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
304a0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
304b0 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
304c0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
304d0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
304e0 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
304f0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
30500 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
30510 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
30520 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
30530 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
30540 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
30550 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
30560 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
30570 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
30580 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
30590 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
305a0 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
305b0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
305c0 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
305d0 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
305e0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
305f0 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
30600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30610 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
30620 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
30630 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
30640 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
30650 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
30660 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
30670 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
30680 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
30690 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
306a0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
306b0 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
306c0 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
306d0 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
306e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
306f0 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
30700 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
30710 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
30720 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
30730 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
30740 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30750 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
30760 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
30770 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
30780 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
30790 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
307a0 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
307b0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
307c0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
307d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
307e0 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
307f0 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
30800 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
30810 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
30820 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
30830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
30840 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
30850 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
30860 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
30870 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
30880 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
30890 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
308a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
308b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
308c0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73  de */.  int exis
308d0 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ts = 1;         
308e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
308f0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
30900 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
30910 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21  int jrnlOpen = !
30920 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
30930 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  jfd);..  assert(
30940 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
30950 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
30960 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
30970 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
30980 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
30990 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a  =PAGER_OPEN );..
309a0 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70    assert( jrnlOp
309b0 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74  en==0 || ( sqlit
309c0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
309d0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
309e0 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c  ->jfd) &.    SQL
309f0 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
30a00 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a  TABLE_WHEN_OPEN.
30a10 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74    ));..  *pExist
30a20 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72  s = 0;.  if( !jr
30a30 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  nlOpen ){.    rc
30a40 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
30a50 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
30a60 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
30a70 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
30a80 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20   &exists);.  }. 
30a90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30aa0 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
30ab0 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d      int locked =
30ac0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30ad0 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
30ae0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
30af0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
30b00 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
30b10 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
30b20 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
30b30 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
30b40 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
30b50 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
30b60 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
30b70 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
30b80 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
30b90 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
30ba0 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
30bb0 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
30bc0 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
30bd0 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
30be0 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
30bf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
30c00 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
30c10 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
30c20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
30c30 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
30c40 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
30c50 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
30c60 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
30c70 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
30c80 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
30c90 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
30ca0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
30cb0 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
30cc0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
30cd0 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
30ce0 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
30cf0 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
30d00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
30d10 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
30d20 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
30d30 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
30d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30d50 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
30d60 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
30d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
30d90 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
30da0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  file */..      a
30db0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
30dc0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20  empFile==0 );.  
30dd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
30de0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
30df0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
30e00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30e10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
30e20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
30e30 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20  s zero pages in 
30e40 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  size, that means
30e50 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29   that either (1)
30e60 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
30e70 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d  journal is a rem
30e80 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f  nant from a prio
30e90 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  r database with 
30ea0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68  the same name wh
30eb0 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ere.        ** t
30ec0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30ed0 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75   but not the jou
30ee0 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64  rnal was deleted
30ef0 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69  , or (2) the ini
30f00 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  tial.        ** 
30f10 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
30f20 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77   populates a new
30f30 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69   database is bei
30f40 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ng rolled back..
30f50 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69          ** In ei
30f60 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a  ther case, the j
30f70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20  ournal file can 
30f80 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77  be deleted.  How
30f90 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a  ever, take care.
30fa0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74          ** not t
30fb0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
30fc0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
30fd0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
30fe0 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  due to.        *
30ff0 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  * journal_mode=P
31000 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20  ERSIST..        
31010 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  */.        if( n
31020 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c  Page==0 && !jrnl
31030 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
31040 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
31050 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
31060 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
31070 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
31080 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
31090 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
310a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
310b0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
310c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
310d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
310e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
310f0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
31100 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
31110 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
31120 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31140 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
31150 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
31160 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
31170 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
31180 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
31190 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
311a0 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
311b0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
311c0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
311d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
311e0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
311f0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
31200 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
31210 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
31220 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
31230 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31240 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
31250 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
31260 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
31270 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
31280 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
31290 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
312a0 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
312b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
312c0 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
312d0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
312e0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
312f0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
31300 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31310 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
31320 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31330 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
31340 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31350 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
31360 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
31370 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
31380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31390 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
313a0 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
313b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
313c0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
313d0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
313e0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
313f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31400 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
31410 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
31420 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
31440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31450 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
31460 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
31470 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
31480 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
31490 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
314a0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
314b0 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
314c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
314d0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
314e0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
314f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
31500 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
31510 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
31520 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
31530 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
31540 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
31550 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
31560 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
31570 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
31580 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
31590 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
315a0 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
315b0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
315c0 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
315d0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
315e0 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
315f0 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
31600 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
31610 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
31620 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
31630 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
31640 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
31650 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
31660 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
31670 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
31680 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
31690 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
316a0 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
316b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
316c0 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
316d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
316e0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
316f0 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
31700 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
31710 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
31720 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
31730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
31740 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
31750 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31760 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
31770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31780 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
31790 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
317a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
317b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
317c0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
317d0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
317e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
317f0 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
31800 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
31810 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74  e3PagerGet() unt
31820 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
31830 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
31840 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
31850 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
31860 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
31870 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
31880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31890 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
318a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
318b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
318c0 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
318d0 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
318e0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
318f0 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
31900 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
31910 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  y in PAGER_OPEN 
31920 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
31930 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
31940 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31950 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
31960 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
31970 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
31980 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
31990 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
319a0 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
319b0 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
319c0 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
319d0 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
319e0 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
319f0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
31a00 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
31a10 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
31a20 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
31a30 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
31a40 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
31a50 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
31a60 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
31a70 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
31a80 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
31a90 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
31aa0 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
31ab0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
31ac0 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
31ad0 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
31ae0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
31af0 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
31b00 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
31b10 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
31b20 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
31b30 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
31b40 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
31b50 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
31b60 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
31b70 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
31b80 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
31b90 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
31ba0 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
31bb0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
31bc0 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
31bd0 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
31be0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
31bf0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31c00 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
31c10 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
31c20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
31c30 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
31c40 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
31c50 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
31c60 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
31c70 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
31c80 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
31c90 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
31ca0 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
31cb0 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
31cc0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a  urnal file or .*
31cd0 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  * rolling back a
31ce0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
31cf0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
31d00 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
31d10 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31d20 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
31d30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
31d40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31d60 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
31d70 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
31d80 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
31d90 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
31da0 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
31db0 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
31dc0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
31dd0 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73  es. This implies
31de0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
31df0 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74  state should eit
31e00 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e  her.  ** be OPEN
31e10 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44   or READER. READ
31e20 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ER is only possi
31e30 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72  ble if the pager
31e40 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20   is or was in . 
31e50 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
31e60 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20  cess mode.  */. 
31e70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31e80 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
31e90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
31ea0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
31eb0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
31ec0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
31ed0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31ee0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
31ef0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
31f00 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
31f10 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
31f20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
31f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
31f40 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
31f50 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
31f60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
31f70 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
31f80 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
31f90 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
31fa0 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
31fb0 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
31fc0 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
31fd0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
31fe0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31ff0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
32000 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
32010 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
32020 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  CK );..    rc = 
32030 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
32040 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
32050 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
32060 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32070 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32080 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
32090 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
320a0 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
320b0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67  _LOCK );.      g
320c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
320d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  }..    /* If a j
320e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
320f0 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
32100 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
32110 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
32120 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
32130 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
32140 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
32150 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
32160 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32170 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d   pPager->eLock<=
32180 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
32190 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
321a0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
321b0 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  &bHotJournal);. 
321c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
321d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
321e0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
321f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
32200 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
32210 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32220 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
32230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32240 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
32250 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  K;.        goto 
32260 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
32270 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
32280 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
32290 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
322a0 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
322b0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
322c0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
322d0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
322e0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
322f0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
32300 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
32310 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
32320 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
32330 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
32340 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
32350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
32360 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
32370 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
32380 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
32390 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
323a0 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
323b0 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
323c0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
323d0 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
323e0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
323f0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
32400 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
32410 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
32420 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
32430 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
32440 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
32450 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
32460 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
32470 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
32480 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
32490 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
324a0 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
324b0 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
324c0 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
324d0 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
324e0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
324f0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
32500 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
32510 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
32520 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
32530 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
32540 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
32550 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
32560 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
32570 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
32580 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
32590 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
325a0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
325b0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
325c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
325d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
325e0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
325f0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
32600 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
32610 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
32620 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
32630 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
32640 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
32650 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
32660 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
32670 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
32680 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
32690 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
326a0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
326b0 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
326c0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
326d0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
326e0 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
326f0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
32700 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
32710 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
32720 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
32730 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
32740 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
32750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
32760 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
32770 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
32780 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
32790 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
327a0 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
327b0 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
327c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
327d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
327e0 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
327f0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
32800 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
32810 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
32820 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
32830 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
32840 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
32850 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
32860 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
32870 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
32880 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
32890 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
328a0 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
328b0 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
328c0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
328d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
328e0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
328f0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
32900 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
32910 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
32920 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
32930 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32950 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
32960 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
32970 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
32980 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
32990 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
329a0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
329b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
329c0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
329d0 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
329e0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
329f0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
32a00 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
32a10 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
32a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32a30 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
32a40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
32a50 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
32a60 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
32a70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
32a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
32a90 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
32aa0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
32ab0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
32ac0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32ad0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
32ae0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
32af0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
32b00 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
32b10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
32b30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32b40 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
32b50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32b60 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
32b70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
32b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
32ba0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
32bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
32bc0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
32bd0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
32be0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32bf0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
32c00 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
32c10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
32c20 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
32c30 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
32c40 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
32c50 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
32c60 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
32c70 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
32c80 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
32c90 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
32ca0 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
32cb0 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
32cc0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
32cd0 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
32ce0 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
32cf0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
32d00 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
32d10 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
32d20 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
32d30 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
32d40 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
32d50 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
32d60 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
32d70 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
32d80 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
32d90 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
32da0 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
32db0 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
32dc0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
32dd0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32de0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
32df0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
32e00 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
32e10 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
32e20 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
32e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32e50 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
32e60 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
32e70 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  er, !pPager->tem
32e80 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
32e90 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
32ea0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
32eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32ec0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
32ed0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
32ee0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
32ef0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
32f00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
32f10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32f20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32f30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
32f40 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
32f50 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
32f60 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
32f70 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
32f80 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
32f90 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
32fa0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
32fb0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
32fc0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
32fd0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
32fe0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
32ff0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
33000 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
33010 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
33020 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
33030 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
33040 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
33050 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
33060 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
33070 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
33080 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
33090 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
330a0 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
330b0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
330c0 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
330d0 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
330e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
330f0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
33100 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
33110 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
33120 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
33130 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
33140 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
33150 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
33160 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
33170 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
33180 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
33190 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
331a0 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
331b0 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
331c0 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
331d0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
331e0 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
331f0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
33200 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
33210 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
33220 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
33230 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
33240 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
33250 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
33260 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
33270 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
33280 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
33290 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
332a0 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
332b0 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
332c0 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
332d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
332e0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
332f0 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
33300 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
33310 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
33320 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
33330 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
33340 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
33350 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33360 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
33370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
33380 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
33390 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
333a0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
333b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
333c0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
333d0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
333e0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
333f0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
33400 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65  empFile && pPage
33410 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
33420 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
33430 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
33440 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
33450 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65  cquired then che
33460 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ck to.      ** s
33470 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
33480 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
33490 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
334a0 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
334b0 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75  ed,.      ** flu
334c0 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
334d0 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64  he hasHeldShared
334e0 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e  Lock flag preven
334f0 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  ts this from.   
33500 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20     ** occurring 
33510 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73  on the very firs
33520 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69  t access to a fi
33530 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  le, in order to 
33540 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
33550 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61  single unnecessa
33560 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  ry sqlite3OsRead
33570 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73  () call at the s
33580 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a  tart-up..      *
33590 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
335a0 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  ase changes are 
335b0 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
335c0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
335d0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
335e0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
335f0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
33600 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
33610 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
33620 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
33630 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
33640 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
33650 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
33660 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
33670 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
33680 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
33690 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
336a0 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
336b0 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
336c0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
336d0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
336e0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
336f0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
33700 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
33710 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
33720 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
33730 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
33740 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
33750 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
33760 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
33770 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
33780 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64   */.      char d
33790 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
337a0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
337b0 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f  ers)];..      IO
337c0 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
337d0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
337e0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
337f0 72 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20  rs)));.      rc 
33800 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
33810 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
33820 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
33830 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
33840 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33860 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33870 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
33880 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
33890 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
338a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
338b0 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
338c0 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
338d0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
338e0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
338f0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
33900 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
33910 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
33920 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
33930 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
33940 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
33950 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74        /* Unmap t
33960 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33970 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
33980 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70   that external p
33990 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20  rocesses.       
339a0 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75   ** may have tru
339b0 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62  ncated the datab
339c0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
339d0 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61  n extended it ba
339e0 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ck.        ** to
339f0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
33a00 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ze while this pr
33a10 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f  ocess was not ho
33a20 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20  lding a lock..  
33a30 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
33a40 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20   case there may 
33a50 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d  exist a Pager.pM
33a60 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ap mapping that 
33a70 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20  appears.        
33a80 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67  ** to be the rig
33a90 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e  ht size but is n
33aa0 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69  ot actually vali
33ab0 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20  d. Avoid this.  
33ac0 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69        ** possibi
33ad0 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e  lity by unmappin
33ae0 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a  g the db here. *
33af0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53  /.        if( US
33b00 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
33b10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33b20 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
33b30 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
33b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33b50 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
33b60 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41  If there is a WA
33b70 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  L file in the fi
33b80 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20  le-system, open 
33b90 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e  this database in
33ba0 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65   WAL.    ** mode
33bb0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
33bc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
33bd0 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  ion call is a no
33be0 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  -op..    */.    
33bf0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61  rc = pagerOpenWa
33c00 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65  lIfPresent(pPage
33c10 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
33c20 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
33c30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33c40 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  pWal==0 || rc==S
33c50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64  QLITE_OK );.#end
33c60 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  if.  }..  if( pa
33c70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33c80 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
33c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33ca0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
33cb0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
33cc0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
33cd0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
33ce0 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20  >tempFile==0 && 
33cf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33d00 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
33d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33d20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
33d30 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
33d40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
33d50 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
33d60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33d70 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
33d80 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
33d90 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
33da0 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
33db0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33dc0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
33dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
33de0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
33df0 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  GER_READER;.    
33e00 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
33e10 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20  haredLock = 1;. 
33e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33e30 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
33e40 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
33e50 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
33e60 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
33e70 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
33e80 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
33e90 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
33ea0 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
33eb0 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
33ec0 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
33ed0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
33ee0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
33ef0 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
33f00 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
33f10 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
33f20 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
33f30 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
33f40 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
33f50 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
33f60 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
33f70 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
33f80 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73  pPager){.  if( s
33f90 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
33fa0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
33fb0 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ache)==0 ){.    
33fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33fd0 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f  nMmapOut==0 ); /
33fe0 2a 20 62 65 63 61 75 73 65 20 70 61 67 65 31 20  * because page1 
33ff0 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
34000 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61  mapped */.    pa
34010 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
34020 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
34030 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
34040 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f  age getter metho
34050 64 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61  ds each try to a
34060 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
34070 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20  ce to a.** page 
34080 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
34090 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65   pgno. If the re
340a0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
340b0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
340c0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
340d0 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
340e0 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
340f0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
34100 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
34110 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d  different implem
34120 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
34130 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64   getter method d
34140 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74  epending.** on t
34150 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
34160 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   of the pager..*
34170 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  *.**     getPage
34180 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20  Normal()        
34190 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20   --  The normal 
341a0 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65  getter.**     ge
341b0 74 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20  tPageError()    
341c0 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69        --  Used i
341d0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
341e0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
341f0 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d  .**     getPageM
34200 6d 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20  map()           
34210 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f  --  Used if memo
34220 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
34230 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49   enabled.**.** I
34240 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
34250 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
34260 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
34270 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
34280 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
34290 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
342a0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
342b0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
342c0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
342d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
342e0 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
342f0 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
34300 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
34310 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
34320 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
34330 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
34340 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
34350 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
34360 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
34370 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
34380 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
34390 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
343a0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
343b0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
343c0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
343d0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
343e0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
343f0 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
34400 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
34410 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
34420 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
34430 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
34440 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
34450 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
34460 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
34470 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
34480 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
34490 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
344a0 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
344b0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
344c0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
344d0 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73  if .** the flags
344e0 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
344f0 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45  ins the PAGER_GE
34500 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20  T_NOCONTENT bit 
34510 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
34520 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
34530 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
34540 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
34550 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
34560 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
34570 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
34580 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
34590 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
345a0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
345b0 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
345c0 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47  **.** If PAGER_G
345d0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20  ET_NOCONTENT is 
345e0 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
345f0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
34600 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
34610 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
34620 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
34630 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  s in two scenari
34640 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
34650 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
34660 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
34670 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
34680 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
34690 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
346a0 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
346b0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
346c0 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
346d0 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
346e0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
346f0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
34700 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
34710 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
34720 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
34730 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47  al..**.** If PAG
34740 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34750 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
34760 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
34770 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
34780 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72  ad.** of being r
34790 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
347a0 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
347b0 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
347c0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
347d0 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
347e0 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
347f0 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
34800 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
34810 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
34820 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
34830 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
34840 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
34850 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
34860 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
34870 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
34880 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
34890 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
348a0 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
348b0 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
348c0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
348d0 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
348e0 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
348f0 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
34900 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
34910 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
34920 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
34930 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
34940 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
34950 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
34960 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
34970 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
34980 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
34990 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
349a0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
349b0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
349c0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
349d0 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
349e0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
349f0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
34a00 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
34a10 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
34a20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
34a30 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
34a40 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
34a50 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
34a60 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
34a70 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
34a80 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
34a90 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
34aa0 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
34ab0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
34ac0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
34ad0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
34ae0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
34af0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
34b00 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
34b10 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
34b20 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
34b30 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
34b40 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
34b50 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
34b60 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
34b70 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
34b80 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65  geNormal(.  Page
34b90 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
34ba0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
34bb0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
34bc0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
34bd0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
34be0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
34bf0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
34c00 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
34c10 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
34c20 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
34c30 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
34c40 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
34c50 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
34c60 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
34c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34c80 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
34c90 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20   u8 noContent;  
34ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cb0 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45   /* True if PAGE
34cc0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34cd0 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69  is set */.  sqli
34ce0 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
34cf0 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72  *pBase;..  asser
34d00 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
34d10 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
34d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34d30 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
34d40 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
34d50 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
34d60 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
34d70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34d80 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
34d90 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20  edLock==1 );..  
34da0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65  if( pgno==0 ) re
34db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34dc0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73  UPT_BKPT;.  pBas
34dd0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
34de0 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
34df0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29  PCache, pgno, 3)
34e00 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30  ;.  if( pBase==0
34e10 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
34e20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34e30 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65  3PcacheFetchStre
34e40 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ss(pPager->pPCac
34e50 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65  he, pgno, &pBase
34e60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
34e70 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34e80 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34e90 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65  r;.    if( pBase
34ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
34eb0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
34ec0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
34ed0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34ee0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  r;.    }.  }.  p
34ef0 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73  Pg = *ppPage = s
34f00 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34f10 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
34f20 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
34f30 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Base);.  assert(
34f40 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20   pPg==(*ppPage) 
34f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
34f60 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
34f70 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34f80 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
34f90 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
34fa0 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20  );..  noContent 
34fb0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
34fc0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21  _GET_NOCONTENT)!
34fd0 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  =0;.  if( pPg->p
34fe0 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
34ff0 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
35000 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
35010 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
35020 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
35030 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
35040 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
35050 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
35060 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
35070 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
35080 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
35090 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
350a0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
350b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
350c0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48  tat[PAGER_STAT_H
350d0 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  IT]++;.    retur
350e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
350f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
35100 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
35110 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
35120 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
35130 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
35140 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
35150 64 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d  d. But first som
35160 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a  e error checks:.
35170 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31      **.    ** (1
35180 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  ) The maximum pa
35190 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
351a0 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76  1.    ** (2) Nev
351b0 65 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20  er try to fetch 
351c0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  the locking page
351d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
351e0 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
351f0 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
35200 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
35210 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
35220 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35230 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
35240 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35250 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rr;.    }..    p
35260 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
35270 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ger;..    assert
35280 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
35290 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20  ->fd) || !MEMDB 
352a0 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  );.    if( !isOp
352b0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
352c0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
352d0 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
352e0 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
352f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
35300 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
35310 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
35320 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
35330 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35350 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
35360 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
35370 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
35380 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
35390 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
353a0 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
353b0 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
353c0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
353d0 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
353e0 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
353f0 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
35400 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
35410 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
35420 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
35430 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
35440 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
35450 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
35460 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
35470 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
35480 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
35490 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
354a0 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
354b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
354c0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
354d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
354e0 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
354f0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
35500 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
35510 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
35520 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
35530 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
35540 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
35550 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
35560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
35570 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
35580 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
35590 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
355a0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
355b0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
355c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
355d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
355e0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
355f0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
35600 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
35610 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
35620 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
35630 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
35640 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
35650 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
35660 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
35670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
35680 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
35690 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
356a0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
356b0 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d  PAGER_STAT_MISS]
356c0 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
356d0 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
356e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
356f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35700 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
35710 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
35720 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
35730 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
35740 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
35750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
35760 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35770 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
35780 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
35790 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
357a0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
357b0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
357c0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
357d0 70 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61  pPager);.  *ppPa
357e0 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
357f0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
35800 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
35810 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67  >0./* The page g
35820 65 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d  etter for when m
35830 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
35840 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73   is enabled */.s
35850 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
35860 65 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a  eMMap(.  Pager *
35870 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
35880 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
35890 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
358a0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
358b0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
358c0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
358d0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
358e0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
358f0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
35900 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
35910 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
35920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
35930 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
35940 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
35950 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
35960 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
35970 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
35980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35990 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65    /* Frame to re
359a0 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  ad from WAL file
359b0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
359c0 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73  acceptable to us
359d0 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d  e a read-only (m
359e0 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e  map) page for an
359f0 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20  y page except.  
35a00 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65  ** page 1 if the
35a10 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  re is no write-t
35a20 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
35a30 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52  or the ACQUIRE_R
35a40 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61  EADONLY.  ** fla
35a50 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  g was specified 
35a60 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41  by the caller. A
35a70 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68  nd so long as th
35a80 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20  e db is not a . 
35a90 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72   ** temporary or
35aa0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
35ab0 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ase.  */.  const
35ac0 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28   int bMmapOk = (
35ad0 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50  pgno>1.   && (pP
35ae0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35af0 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66  GER_READER || (f
35b00 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
35b10 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b  _READONLY)).  );
35b20 0a 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46  ..  assert( USEF
35b30 45 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a  ETCH(pPager) );.
35b40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
35b50 53 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74  S_CODEC.  assert
35b60 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
35b70 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
35b80 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   /* Optimization
35b90 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74   note:  Adding t
35ba0 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72  he "pgno<=1" ter
35bb0 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d  m before "pgno==
35bc0 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c  0" here.  ** all
35bd0 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ows the compiler
35be0 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65   optimizer to re
35bf0 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  use the results 
35c00 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a  of the "pgno>1".
35c10 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65    ** test in the
35c20 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d   previous statem
35c30 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74  ent, and avoid t
35c40 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69  esting pgno==0 i
35c50 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f  n the.  ** commo
35c60 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e  n case where pgn
35c70 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20  o is large. */. 
35c80 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20   if( pgno<=1 && 
35c90 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
35ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
35cb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
35cc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35cd0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
35ce0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
35cf0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35d00 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35d10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35d20 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
35d30 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
35d40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
35d50 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
35d60 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f  );..  if( bMmapO
35d70 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  k && pagerUseWal
35d80 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35d90 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
35da0 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
35db0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
35dc0 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  rame);.    if( r
35dd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35de0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
35df0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
35e00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
35e10 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69  if( bMmapOk && i
35e20 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Frame==0 ){.    
35e30 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
35e40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35e50 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d  3OsFetch(pPager-
35e60 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69  >fd, .        (i
35e70 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
35e80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
35e90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
35ea0 2c 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a  , &pData.    );.
35eb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35ec0 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29  TE_OK && pData )
35ed0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
35ee0 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
35ef0 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65  _READER || pPage
35f00 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
35f10 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c         pPg = sql
35f20 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
35f30 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
35f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35f50 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
35f60 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
35f70 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
35f80 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c  er, pgno, pData,
35f90 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65   &pPg);.      }e
35fa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
35fb0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
35fc0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
35fd0 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
35fe0 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
35ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36000 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
36010 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
36020 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
36030 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
36040 67 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  g;.        retur
36050 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
36060 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
36070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36080 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
36090 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
360a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
360b0 7d 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61  }.  return getPa
360c0 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c  geNormal(pPager,
360d0 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
360e0 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  lags);.}.#endif 
360f0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
36100 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
36110 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72   The page getter
36120 20 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e   method for when
36130 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e   the pager is an
36140 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
36150 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
36160 67 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72  geError(.  Pager
36170 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
36180 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
36190 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
361a0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
361b0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
361c0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
361d0 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
361e0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
361f0 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
36200 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
36210 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
36220 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
36230 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
36240 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ags */.){.  UNUS
36250 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e  ED_PARAMETER(pgn
36260 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  o);.  UNUSED_PAR
36270 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20  AMETER(flags);. 
36280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36290 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
362a0 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  _OK );.  *ppPage
362b0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
362c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
362d0 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20  }.../* Dispatch 
362e0 61 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72  all page fetch r
362f0 65 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61  equests to the a
36300 70 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65  ppropriate gette
36310 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74  r method..*/.int
36320 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36330 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
36340 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
36350 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
36360 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
36370 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
36380 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36390 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
363a0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
363b0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
363c0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
363d0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
363e0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
363f0 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
36400 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
36410 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
36420 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c  er->xGet(pPager,
36430 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
36440 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lags);.}../*.** 
36450 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
36460 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
36470 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
36480 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
36490 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
364a0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
364b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
364c0 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
364d0 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
364e0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
364f0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
36500 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36510 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
36520 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
36530 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
36540 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
36550 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
36560 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
36570 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
36580 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
36590 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
365a0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
365b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
365c0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
365d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
365e0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
365f0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
36600 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
36610 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
36620 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
36630 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
36640 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
36650 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  {.  sqlite3_pcac
36660 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a  he_page *pPage;.
36670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36680 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
36690 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
366a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
366b0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50  Cache!=0 );.  pP
366c0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
366d0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
366e0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
366f0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  0);.  assert( pP
36700 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  age==0 || pPager
36710 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
36720 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ock );.  if( pPa
36730 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
36740 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
36750 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
36760 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
36770 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  che, pgno, pPage
36780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
36790 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
367a0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
367b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
367c0 66 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50  f() and sqlite3P
367d0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
367e0 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a  () may only be.*
367f0 2a 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e 6f  * used if we kno
36800 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  w that the page 
36810 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20 69  being released i
36820 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 70  s not the last p
36830 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65  age..** The btre
36840 65 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20 68  e layer always h
36850 6f 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e 20  olds page1 open 
36860 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20 73  until the end, s
36870 6f 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a 2a  o these first.**
36880 20 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61 6e   to routines can
36890 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c 65   be used to rele
368a0 61 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74 68  ase any page oth
368b0 65 72 20 74 68 61 6e 20 42 74 53 68 61 72 65 64  er than BtShared
368c0 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55  .pPage1..**.** U
368d0 73 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  se sqlite3PagerU
368e0 6e 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74 6f  nrefPageOne() to
368f0 20 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e 20   release page1. 
36900 20 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f 75   This latter rou
36910 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74  tine.** checks t
36920 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
36930 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  of outstanding p
36940 61 67 65 73 20 61 6e 64 20 69 66 20 74 68 65 20  ages and if the 
36950 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
36960 65 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  es reaches zero 
36970 69 74 20 64 72 6f 70 73 20 74 68 65 20 64 61 74  it drops the dat
36980 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76  abase lock..*/.v
36990 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
369a0 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50  UnrefNotNull(DbP
369b0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45 53  age *pPg){.  TES
369c0 54 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70 50  TONLY( Pager *pP
369d0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
369e0 65 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20  er; ).  assert( 
369f0 70 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pPg!=0 );.  if( 
36a00 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
36a10 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61  DR_MMAP ){.    a
36a20 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
36a30 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65 31  !=1 );  /* Page1
36a40 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79   is never memory
36a50 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70   mapped */.    p
36a60 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
36a70 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
36a80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
36a90 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
36aa0 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  .  }.  /* Do not
36ab0 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
36ac0 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  e to release the
36ad0 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65 20   last reference 
36ae0 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61 73  to page1 */.  as
36af0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
36b00 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
36b10 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
36b20 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
36b30 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
36b40 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
36b50 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  Pg ) sqlite3Page
36b60 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
36b70 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  g);.}.void sqlit
36b80 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65  e3PagerUnrefPage
36b90 4f 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  One(DbPage *pPg)
36ba0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
36bb0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  r;.  assert( pPg
36bc0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
36bd0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
36be0 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d  .  assert( (pPg-
36bf0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
36c00 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61  MAP)==0 ); /* Pa
36c10 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d  ge1 is never mem
36c20 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20  ory mapped */.  
36c30 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
36c40 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50  ager;.  sqlite3P
36c50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d  agerResetLockTim
36c60 65 6f 75 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eout(pPager);.  
36c70 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
36c80 65 61 73 65 28 70 50 67 29 3b 0a 20 20 70 61 67  ease(pPg);.  pag
36c90 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
36ca0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
36cb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
36cc0 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
36cd0 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
36ce0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
36cf0 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
36d00 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
36d10 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
36d20 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
36d30 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
36d40 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
36d50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
36d60 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
36d70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
36d80 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
36d90 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
36da0 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
36db0 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
36dc0 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
36dd0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
36de0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
36df0 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
36e00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
36e10 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
36e20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36e30 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
36e40 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
36e50 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
36e60 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
36e70 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
36e80 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
36e90 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
36ea0 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
36eb0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
36ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
36ed0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
36ee0 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
36ef0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
36f00 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
36f10 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
36f20 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
36f30 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
36f40 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
36f50 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
36f60 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
36f70 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
36f80 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
36f90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
36fa0 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
36fb0 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
36fc0 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
36fd0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
36fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
36ff0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
37000 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
37010 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
37020 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
37030 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
37040 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
37050 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
37060 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
37070 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
37080 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
37090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
370a0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
370b0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
370c0 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
370d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
370e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
370f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37100 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
37110 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
37120 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
37130 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
37140 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
37150 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
37160 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
37170 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37180 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37190 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
371a0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
371b0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
371c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
371d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
371e0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
371f0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
37200 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
37210 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
37220 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
37230 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
37240 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
37250 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
37260 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
37270 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
37280 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
37290 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
372a0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
372b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
372c0 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
372d0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
372e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
372f0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
37300 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
37310 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
37320 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
37330 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
37340 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
37350 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
37360 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
37370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37380 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
37390 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
373a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
373b0 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
373c0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
373d0 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
373e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
373f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
37400 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
37410 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37420 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
37430 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
37440 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
37450 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
37460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
37470 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
37480 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
37490 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
374a0 45 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  E;.        int n
374b0 53 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20  Spill;..        
374c0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
374d0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
374e0 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
374f0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
37500 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
37510 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b  N_TEMP_JOURNAL);
37520 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c  .          nSpil
37530 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  l = sqlite3Confi
37540 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20  g.nStmtSpill;.  
37550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37560 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
37570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
37580 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
37590 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e      nSpill = jrn
375a0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
375b0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
375c0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
375d0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
375e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
375f0 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65  ill has the same
37600 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20   name as it did 
37610 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
37620 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  it was originall
37630 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20  y opened. */.   
37640 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61       rc = databa
37650 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67  seIsUnmoved(pPag
37660 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
37670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37680 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
37690 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
376a0 70 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20  pen (.          
376b0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
376c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
376d0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
376e0 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  nSpill.         
376f0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
37700 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
37710 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
37720 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
37730 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
37740 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
37750 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
37760 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
37770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37780 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
37790 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
377a0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
377b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
377c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
377d0 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
377e0 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
377f0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
37800 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
37810 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
37820 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
37830 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
37840 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
37850 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
37860 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
37870 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
37880 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
37890 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
378a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
378b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
378c0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
378d0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
378e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
378f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
37900 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
37910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
37920 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37930 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37940 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
37950 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
37960 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
37970 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
37980 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37990 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
379a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
379b0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
379c0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
379d0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
379e0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
379f0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
37a00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37a10 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
37a20 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
37a30 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
37a40 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
37a50 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
37a60 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
37a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
37a80 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
37a90 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
37aa0 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
37ab0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
37ac0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
37ad0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
37ae0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
37af0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
37b00 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
37b10 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
37b20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
37b30 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
37b40 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
37b50 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
37b60 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
37b70 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
37b80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
37b90 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
37ba0 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
37bb0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
37bc0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
37bd0 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
37be0 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
37bf0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
37c00 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
37c10 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
37c20 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
37c30 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
37c40 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
37c50 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
37c60 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
37c70 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
37c80 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
37c90 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
37ca0 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
37cb0 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
37cc0 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
37cd0 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
37ce0 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
37cf0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
37d00 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
37d10 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
37d20 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
37d30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37d40 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
37d50 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
37d60 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
37d70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
37d80 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
37d90 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
37da0 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
37db0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
37dc0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
37dd0 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
37de0 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
37df0 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
37e00 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
37e10 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
37e20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37e30 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
37e40 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
37e50 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
37e60 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
37e70 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
37e80 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
37e90 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
37ea0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
37eb0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
37ec0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
37ed0 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
37ee0 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
37ef0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
37f00 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
37f10 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
37f20 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
37f30 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
37f40 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
37f50 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
37f60 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
37f70 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
37f80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
37fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28       }.        (
37fc0 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45  void)sqlite3WalE
37fd0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
37fe0 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
37ff0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
38000 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
38010 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
38020 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
38030 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
38040 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
38050 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
38060 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
38070 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
38080 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
38090 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
380a0 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
380b0 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
380c0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
380d0 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
380e0 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
380f0 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
38100 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
38110 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20   will call it.. 
38120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
38130 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
38140 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
38150 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
38160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
38170 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
38180 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
38190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
381a0 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
381b0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
381c0 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
381d0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
381e0 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
381f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
38200 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
38210 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
38220 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
38230 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
38240 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
38250 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
38260 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
38270 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
38280 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
38290 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
382a0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
382b0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
382c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
382d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
382e0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
382f0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
38300 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
38310 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
38320 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
38330 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38340 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
38350 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52  Change to WRITER
38360 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20  _LOCKED state.. 
38370 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
38380 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50   WAL mode sets P
38390 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50  ager.eState to P
383a0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
383b0 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20  ED or CACHEMOD. 
383c0 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20       ** when it 
383d0 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  has an open tran
383e0 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
383f0 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46  er to DBMOD or F
38400 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a  INISHED..      *
38410 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
38420 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65  e in those state
38430 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  s the code to ro
38440 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
38450 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
38460 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70  sactions may cop
38470 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  y data from the 
38480 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f  sub-journal into
38490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
384a0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
384b0 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65  well as into the
384c0 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
384d0 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
384e0 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20  rrect in .      
384f0 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20  ** WAL mode..   
38500 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
38510 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
38520 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
38530 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
38540 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
38550 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
38560 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
38570 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
38580 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
38590 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
385a0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
385b0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
385c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
385d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
385e0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
385f0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
38600 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
38610 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
38620 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
38630 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
38640 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
38650 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
38660 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
38670 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
38680 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
38690 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
386a0 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
386b0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
386c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a