/ Hex Artifact Content
Login

Artifact 817afaac17f7c4b1282d9aa283f10fc4b58d5d1e4afb12f84c46038904311650:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le */.#ifndef SQ
7c50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
7c60: 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20 2a 70  RENT.  Bitvec *p
7c70: 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20 20 20  AllRead;        
7c80: 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65 61 64     /* Pages read
7c90: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
7ca0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
7cb0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 71  . */.#endif.  sq
7cc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
7cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7ce0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7cf0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
7d00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
7d10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
7d20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7d30: 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  r main journal *
7d40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7d50: 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20   *sjfd;         
7d60: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7d70: 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  or for sub-journ
7d80: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  al */.  i64 jour
7d90: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
7da0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77      /* Current w
7db0: 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  rite offset in t
7dc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7dd0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
7de0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
7df0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
7e00: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
7e10: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
7e20: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
7e30: 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50  pBackup;    /* P
7e40: 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f  ointer to list o
7e50: 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70  f ongoing backup
7e60: 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20   processes */.  
7e70: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
7e80: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
7e90: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
7ea0: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
7eb0: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7ed0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
7ee0: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
7ef0: 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61 56   */.  u32 iDataV
7f00: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
7f10: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
7f20: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 63  never database c
7f30: 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20 2a  ontent changes *
7f40: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7f50: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7f60: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7f70: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7f80: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20  e changes */..  
7f90: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7fb0: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7fc0: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7fd0: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7fe0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ff0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
8000: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
8010: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
8020: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
8030: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
8040: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
8050: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
8060: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
8070: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
8080: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
8090: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
80f0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
8100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8110: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
8120: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
8130: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
8140: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8160: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8170: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8180: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8190: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
81a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
81b0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
81c0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
81d0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
81f0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
8200: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
8210: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
8220: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8230: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8240: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8250: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8270: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8280: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8290: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
82a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
82b0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
82c0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
82d0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
82e0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
82f0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
8300: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8320: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
8330: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
8340: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8350: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8360: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8370: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8380: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8390: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
83a0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
83b0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
83c0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
83d0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
83e0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
83f0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
8400: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8410: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
8420: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
8430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8440: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8470: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8480: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8490: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
84a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
84b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
84c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ing pages */.  i
84d0: 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65 72  nt (*xGet)(Pager
84e0: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
84f0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
8500: 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74 63   to fetch a patc
8510: 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  h */.#ifdef SQLI
8520: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
8530: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
8540: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
8550: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
8560: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
8570: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
8580: 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  (*xCodecSizeChng
8590: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29  )(void*,int,int)
85a0: 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70  ; /* Notify of p
85b0: 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73  age size changes
85c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
85d0: 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b  decFree)(void*);
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85f0: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  Destructor for t
8600: 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f  he codec */.  vo
8610: 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20  id *pCodec;     
8620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
8630: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
8640: 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73  Codec... methods
8650: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
8660: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
8670: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8680: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
8690: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
86a0: 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68  p use */.  PCach
86b0: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
86c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
86d0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
86e0: 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65  object */.#ifnde
86f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
8700: 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20  L.  Wal *pWal;  
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c  /* Write-ahead l
8730: 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72  og used by "jour
8740: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f  nal_mode=wal" */
8750: 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20  .  char *zWal;  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8770: 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  * File name for 
8780: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
8790: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
87a0: 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72 20  .** Indexes for 
87b0: 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e 61  use with Pager.a
87c0: 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67 65  Stat[]. The Page
87d0: 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79 20  r.aStat[] array 
87e0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
87f0: 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64 20  values accessed 
8800: 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49 54  by passing SQLIT
8810: 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
8820: 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53 53  _HIT, CACHE_MISS
8830: 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57 52   .** or CACHE_WR
8840: 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f 64  ITE to sqlite3_d
8850: 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23  b_status()..*/.#
8860: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41  define PAGER_STA
8870: 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69 6e  T_HIT   0.#defin
8880: 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  e PAGER_STAT_MIS
8890: 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47  S  1.#define PAG
88a0: 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32 0a  ER_STAT_WRITE 2.
88b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
88c0: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
88d0: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
88e0: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
88f0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
8900: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
8910: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
8920: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
8930: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
8940: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
8950: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
8960: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
8970: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
8980: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
8990: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
89a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
89b0: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
89c0: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
89d0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
89e0: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
89f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8a00: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
8a10: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
8a20: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
8a30: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
8a40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8a50: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8a60: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66  journal */.# def
8a70: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
8a80: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
8a90: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8aa0: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  (v).#endif..../*
8ab0: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
8ac0: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
8ad0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
8ae0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
8af0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
8b00: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
8b10: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
8b20: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
8b30: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
8b40: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
8b50: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
8b60: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
8b70: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
8b80: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
8b90: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
8ba0: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
8bb0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
8bc0: 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69   is being.** wri
8bd0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
8be0: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
8bf0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
8c00: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
8c10: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
8c20: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
8c30: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
8c40: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
8c50: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
8c60: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
8c70: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
8c80: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
8c90: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
8ca0: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
8cb0: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
8cc0: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
8cd0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
8ce0: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
8cf0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
8d00: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
8d10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
8d20: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
8d30: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
8d40: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
8d50: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
8d60: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
8d70: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
8d80: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
8d90: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
8da0: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
8db0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
8dc0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
8dd0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
8de0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8df0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
8e00: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
8e10: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
8e20: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
8e30: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
8e40: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
8e50: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
8e60: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
8e70: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
8e80: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
8e90: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
8ea0: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
8eb0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
8ec0: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
8ed0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
8ee0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
8ef0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
8f00: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
8f10: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
8f20: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
8f30: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
8f40: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
8f50: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
8f60: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
8f70: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
8f80: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
8f90: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
8fa0: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
8fb0: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
8fc0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
8fd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
8fe0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
8ff0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
9000: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
9010: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
9020: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
9030: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66  e size of the of
9040: 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72   each page recor
9050: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
9060: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
9070: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
9080: 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  cro..*/.#define 
9090: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
90a0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
90b0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
90c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
90d0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
90e0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  or this pager. T
90f0: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74  his is usually t
9100: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65  he same .** size
9110: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73   as a single dis
9120: 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c  k sector. See al
9130: 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  so setSectorSize
9140: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ()..*/.#define J
9150: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9160: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
9170: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
9180: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
9190: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
91a0: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
91b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
91c0: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
91d0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
91e0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
91f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
9200: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
9210: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
9220: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
9230: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
9240: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
9250: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
9260: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
9270: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
9280: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
9290: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
92a0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
92b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
92c0: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
92d0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
92e0: 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46  * The macro USEF
92f0: 45 54 43 48 20 69 73 20 74 72 75 65 20 69 66 20  ETCH is true if 
9300: 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  we are allowed t
9310: 6f 20 75 73 65 20 74 68 65 20 78 46 65 74 63 68  o use the xFetch
9320: 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a   and xUnfetch.**
9330: 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61   interfaces to a
9340: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
9350: 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d  se using memory-
9360: 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23  mapped I/O..*/.#
9370: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
9380: 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69  AP_SIZE>0.# defi
9390: 6e 65 20 55 53 45 46 45 54 43 48 28 78 29 20 28  ne USEFETCH(x) (
93a0: 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a  (x)->bUseFetch).
93b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
93c0: 53 45 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e  SEFETCH(x) 0.#en
93d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  dif../*.** The m
93e0: 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67  aximum legal pag
93f0: 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33  e number is (2^3
9400: 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69  1 - 1)..*/.#defi
9410: 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  ne PAGER_MAX_PGN
9420: 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a  O 2147483647../*
9430: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
9440: 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
9450: 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  s a file descrip
9460: 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65  tor (type sqlite
9470: 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74  3_file*)..** Ret
9480: 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e  urn 0 if it is n
9490: 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d  ot open, or non-
94a0: 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29  zero (but not 1)
94b0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
94c0: 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
94d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
94e0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a   be written as:.
94f0: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70  **.**   if( isOp
9500: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
9510: 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73  ){ ....**.** ins
9520: 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20  tead of.**.**   
9530: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d  if( pPager->jfd-
9540: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e  >pMethods ){ ...
9550: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70  .*/.#define isOp
9560: 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e  en(pFd) ((pFd)->
9570: 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a  pMethods!=0)../*
9580: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
9590: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
95a0: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
95b0: 20 6c 6f 67 20 74 6f 20 72 65 61 64 20 70 61 67   log to read pag
95c0: 65 20 70 67 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72  e pgno..** Retur
95d0: 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70  n false if the p
95e0: 61 67 65 72 20 72 65 61 64 73 20 70 67 6e 6f 20  ager reads pgno 
95f0: 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
9600: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 23  e database..*/.#
9610: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9620: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 26 26 20  TE_OMIT_WAL) && 
9630: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
9640: 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
9650: 45 41 44 29 0a 69 6e 74 20 73 71 6c 69 74 65 33  EAD).int sqlite3
9660: 50 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65  PagerUseWal(Page
9670: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
9680: 70 67 6e 6f 29 7b 0a 20 20 75 33 32 20 69 52 65  pgno){.  u32 iRe
9690: 61 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ad = 0;.  int rc
96a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
96b0: 70 57 61 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  pWal==0 ) return
96c0: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
96d0: 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
96e0: 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
96f0: 6f 2c 20 26 69 52 65 61 64 29 3b 0a 20 20 72 65  o, &iRead);.  re
9700: 74 75 72 6e 20 72 63 20 7c 7c 20 69 52 65 61 64  turn rc || iRead
9710: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  ;.}.#endif.#ifnd
9720: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
9730: 41 4c 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  AL.# define page
9740: 72 55 73 65 57 61 6c 28 78 29 20 28 28 78 29 2d  rUseWal(x) ((x)-
9750: 3e 70 57 61 6c 21 3d 30 29 0a 23 65 6c 73 65 0a  >pWal!=0).#else.
9760: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73  # define pagerUs
9770: 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  eWal(x) 0.# defi
9780: 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  ne pagerRollback
9790: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
97a0: 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  e pagerWalFrames
97b0: 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65  (v,w,x,y) 0.# de
97c0: 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61  fine pagerOpenWa
97d0: 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51  lIfPresent(z) SQ
97e0: 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65  LITE_OK.# define
97f0: 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
9800: 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51  ransaction(z) SQ
9810: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
9820: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
9830: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
9840: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
9850: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9860: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a  pPager) );.**.**
9870: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9880: 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73  uns many asserts
9890: 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20   to try to find 
98a0: 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20  inconsistencies 
98b0: 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  in.** the intern
98c0: 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
98d0: 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Pager object..*/
98e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65  .static int asse
98f0: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50  rt_pager_state(P
9900: 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65  ager *p){.  Page
9910: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a  r *pPager = p;..
9920: 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20    /* State must 
9930: 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61  be valid. */.  a
9940: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
9950: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20  ==PAGER_OPEN.   
9960: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9970: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20  ==PAGER_READER. 
9980: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9990: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
99a0: 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
99b0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
99c0: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
99d0: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
99e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
99f0: 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20  ITER_DBMOD.     
9a00: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9a10: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
9a20: 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  ISHED.       || 
9a30: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9a40: 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f  _ERROR.  );..  /
9a50: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
9a60: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
9a70: 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63  e, a temp-file c
9a80: 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73  onnection always
9a90: 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73   behaves.  ** as
9aa0: 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78   if it has an ex
9ab0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
9ac0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9ad0: 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61  e. It never upda
9ae0: 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61  tes.  ** the cha
9af0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
9b00: 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65  d, so the change
9b10: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
9b20: 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20  s always set..  
9b30: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9b40: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
9b50: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
9b60: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  VE_LOCK );.  ass
9b70: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9b80: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63  ==0 || pPager->c
9b90: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
9ba0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
9bb0: 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69  seJournal flag i
9bc0: 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75  s clear, the jou
9bd0: 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62  rnal-mode must b
9be0: 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41  e "OFF". .  ** A
9bf0: 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd if the journa
9c00: 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c  l-mode is "OFF",
9c10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9c20: 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70  e must not be op
9c30: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  en..  */.  asser
9c40: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9c50: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9c60: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75  MODE_OFF || p->u
9c70: 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
9c80: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9c90: 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
9ca0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20  RNALMODE_OFF || 
9cb0: 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20  !isOpen(p->jfd) 
9cc0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
9cd0: 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65  hat MEMDB implie
9ce0: 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e  s noSync. And an
9cf0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9d00: 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20  al. Since .  ** 
9d10: 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e  this means an in
9d20: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65  -memory pager pe
9d30: 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20  rforms no IO at 
9d40: 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65  all, it cannot e
9d50: 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65  ncounter .  ** e
9d60: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45  ither SQLITE_IOE
9d70: 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  RR or SQLITE_FUL
9d80: 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  L during rollbac
9d90: 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c  k or while final
9da0: 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f  izing .  ** a jo
9db0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74  urnal file. (alt
9dc0: 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d  hough the in-mem
9dd0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c  ory journal impl
9de0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a  ementation may .
9df0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
9e00: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77  TE_IOERR_NOMEM w
9e10: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
9e20: 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77   file is being w
9e30: 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a  ritten). It .  *
9e40: 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e  * is therefore n
9e50: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
9e60: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9e70: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
9e80: 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74  ERROR .  ** stat
9e90: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  e..  */.  if( ME
9ea0: 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72  MDB ){.    asser
9eb0: 74 28 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64  t( !isOpen(p->fd
9ec0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9ed0: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
9ee0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9ef0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9f00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9f10: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
9f20: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f30: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9f40: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
9f50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
9f60: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9f70: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9f80: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9f90: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9fa0: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9fb0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9fc0: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9fd0: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9fe0: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9ff0: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
a000: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
a010: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
a020: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
a030: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
a040: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a050: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
a060: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
a070: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
a080: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
a090: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
a0a0: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
a0b0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
a0c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a0d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a0e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a0f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a100: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
a110: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
a120: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
a130: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
a140: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a150: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
a160: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
a170: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a180: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a1a0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
a1b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a1c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
a1d0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
a1e0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a1f0: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a200: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
a210: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a220: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a240: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a250: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a260: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
a270: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
a280: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a290: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
a2a0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
a2b0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
a2c0: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
a2d0: 54 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  T.      assert( 
a2e0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
a2f0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a300: 7a 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 41  ze || pPager->pA
a310: 6c 6c 52 65 61 64 20 29 3b 0a 23 65 6e 64 69 66  llRead );.#endif
a320: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a330: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a340: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a350: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a360: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a370: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a380: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a390: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a3a0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a3b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a3c0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a3d0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a3e0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a3f0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a400: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a410: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a420: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a430: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a440: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a450: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a460: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a470: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a480: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a490: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a4a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a4b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a4c0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a4d0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a4e0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a4f0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a500: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a510: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a520: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a530: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a540: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a550: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a560: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a570: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a580: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a590: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a5a0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a5b0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a5c0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a5d0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a5e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a5f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a600: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a610: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a630: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a640: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a650: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a660: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a670: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a680: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a690: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a6a0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a6b0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a6c0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a6d0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a6e0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a6f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a700: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a710: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a720: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a730: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a740: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a750: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a760: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a770: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a780: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a790: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a7a0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a7b0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a7c0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a7d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a7e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a7f0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a800: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a810: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a820: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a830: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a840: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a850: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a870: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a880: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a890: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a8a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a8b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a8c0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a8d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a8e0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a8f0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a900: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a910: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a920: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a930: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a940: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a950: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a960: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a970: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a980: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a990: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a9a0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a9b0: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a9c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a9d0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a9e0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a9f0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
aa00: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
aa10: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
aa20: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
aa30: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
aa40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
aa50: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
aa60: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
aa70: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
aa80: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
aa90: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
aaa0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20  ->pPCache)>0 || 
aab0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
aac0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aad0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
aae0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
aaf0: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
ab00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ab10: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
ab20: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
ab30: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
ab40: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
ab50: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
ab60: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
ab70: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
ab80: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
ab90: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
aba0: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
abb0: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
abc0: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
abd0: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
abe0: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
abf0: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
ac00: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
ac10: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
ac20: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
ac30: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
ac40: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
ac50: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
ac60: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
ac70: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
ac80: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
ac90: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
aca0: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
acb0: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
acc0: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
acd0: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
ace0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
acf0: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
ad00: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
ad10: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
ad20: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
ad30: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
ad40: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
ad50: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
ad60: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
ad70: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
ad80: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
ad90: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ada0: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
adb0: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
adc0: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
add0: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
ade0: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
adf0: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
ae00: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
ae10: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
ae20: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
ae30: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
ae40: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
ae50: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ae60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
ae70: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
ae80: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
ae90: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
aea0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
aeb0: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
aec0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
aed0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
aee0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
aef0: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
af00: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af10: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
af20: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
af30: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
af40: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
af50: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
af60: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
af70: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
af80: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
af90: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
afa0: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
afb0: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
afc0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
afd0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
afe0: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
aff0: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
b000: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
b010: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
b020: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
b030: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
b040: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
b050: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
b060: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
b070: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
b080: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
b090: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
b0a0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
b0b0: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
b0c0: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
b0d0: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
b0e0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
b0f0: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
b100: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
b110: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b120: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
b130: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
b140: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
b150: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b160: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
b170: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
b180: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b190: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b1a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
b1b0: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
b1c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b1d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b1e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
b1f0: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
b200: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b210: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b220: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
b230: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
b240: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b250: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b260: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
b270: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
b280: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b290: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
b2a0: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
b2b0: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
b2c0: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
b2d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
b2e0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
b2f0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
b300: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
b310: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
b320: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
b330: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
b340: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  .}.#endif../* Fo
b350: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
b360: 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
b370: 70 61 67 65 20 67 65 74 74 65 72 73 20 2a 2f 0a  page getters */.
b380: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
b390: 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72 2a 2c  geNormal(Pager*,
b3a0: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b3b0: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 67  t);.static int g
b3c0: 65 74 50 61 67 65 45 72 72 6f 72 28 50 61 67 65  etPageError(Page
b3d0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b3e0: 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c 49 54  ,int);.#if SQLIT
b3f0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
b400: 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  0.static int get
b410: 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72 2a 2c  PageMMap(Pager*,
b420: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b430: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  t);.#endif../*.*
b440: 2a 20 53 65 74 20 74 68 65 20 50 61 67 65 72 2e  * Set the Pager.
b450: 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f 72 20  xGet method for 
b460: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
b470: 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
b480: 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65 6e 74  fetch.** content
b490: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
b4a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b4b0: 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
b4c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b4d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
b4e0: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70 50 61  rCode ){.    pPa
b4f0: 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65 74 50  ger->xGet = getP
b500: 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20 53 51  ageError;.#if SQ
b510: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b520: 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69 66 28  ZE>0.  }else if(
b530: 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
b540: 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ).#ifdef SQLITE_
b550: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20  HAS_CODEC.   && 
b560: 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d  pPager->xCodec==
b570: 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  0.#endif.  ){.  
b580: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b590: 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a 23 65   getPageMMap;.#e
b5a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
b5b0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
b5c0: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  /.  }else{.    p
b5d0: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b5e0: 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20 20 7d  tPageNormal;.  }
b5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b600: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
b610: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
b620: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
b630: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b640: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
b650: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
b660: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b670: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
b680: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
b690: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
b6a0: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
b6b0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
b6c0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
b6d0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
b6e0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
b6f0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
b700: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
b710: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
b720: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
b730: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
b740: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b750: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
b760: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
b770: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
b780: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b790: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b7a0: 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72  >pPager;.  Pager
b7b0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20  Savepoint *p;.  
b7c0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b7d0: 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a  >pgno;.  int i;.
b7e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b7f0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b800: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
b810: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b820: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b830: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b840: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b850: 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e  cTestNotNull(p->
b860: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
b870: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
b880: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
b890: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b8a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b8b0: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
b8c0: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
b8d0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
b8e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b8f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b900: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 61  pageInJournal(Pa
b910: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
b920: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
b930: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
b940: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
b950: 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
b960: 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  no);.}.#endif../
b970: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
b980: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
b990: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b9a0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
b9b0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
b9c0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
b9d0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
b9e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
b9f0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
ba00: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
ba10: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
ba20: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
ba30: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
ba40: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
ba50: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
ba60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
ba70: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
ba80: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
ba90: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
baa0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
bab0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
bac0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
bad0: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
bae0: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
baf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bb00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
bb10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
bb20: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
bb30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bb40: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
bb50: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
bb60: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
bb70: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
bb80: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
bb90: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
bba0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
bbb0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
bbc0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bbd0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bbe0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
bbf0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
bc00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
bc10: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
bc20: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
bc30: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
bc40: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
bc50: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
bc60: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
bc70: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
bc80: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
bc90: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
bca0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
bcb0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
bcc0: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
bcd0: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
bce0: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bcf0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
bd00: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
bd10: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
bd20: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
bd30: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
bd40: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
bd50: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
bd60: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
bd70: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
bd80: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
bd90: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
bda0: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
bdb0: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
bdc0: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
bdd0: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
bde0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
bdf0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
be00: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
be10: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
be20: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
be30: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
be40: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
be50: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
be60: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
be70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
be80: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
be90: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
bea0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
beb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bec0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
bed0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
bee0: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
bef0: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
bf00: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
bf10: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
bf20: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
bf30: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
bf40: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
bf50: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
bf60: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
bf70: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
bf80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
bf90: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
bfa0: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50  k );.    rc = pP
bfb0: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bfc0: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bfd0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
bfe0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
bff0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
c000: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
c010: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
c020: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c030: 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eLock;.    }.   
c040: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
c050: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c060: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a  er, eLock)).  }.
c070: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c080: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64  /*.** Lock the d
c090: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
c0a0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
c0b0: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
c0c0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a  r SHARED_LOCK,.*
c0d0: 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  * RESERVED_LOCK 
c0e0: 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
c0f0: 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  K. If the caller
c100: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
c110: 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  set the.** Pager
c120: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
c130: 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  to the new locki
c140: 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  ng state. .**.**
c150: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
c160: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
c170: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
c180: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c190: 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c  n is .** called,
c1a0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c1b0: 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77  t unless the new
c1c0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69   locking state i
c1d0: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
c1e0: 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f  . .** See the co
c1f0: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
c200: 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f  #define of UNKNO
c210: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
c220: 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f  xplanation .** o
c230: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
c240: 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44  c int pagerLockD
c250: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c260: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c270: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c280: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c  K;..  assert( eL
c290: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c2a0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   || eLock==RESER
c2b0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  VED_LOCK || eLoc
c2c0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c2d0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
c2e0: 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c  r->eLock<eLock |
c2f0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
c300: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
c310: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
c320: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
c330: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
c340: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
c350: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
c360: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c370: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
c380: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
c390: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c3a0: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
c3b0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
c3c0: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
c3d0: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
c3e0: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
c3f0: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
c400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c420: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
c430: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
c440: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
c450: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
c460: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
c470: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
c480: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
c490: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
c4a0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
c4b0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
c4c0: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
c4d0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
c4e0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
c4f0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
c500: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
c510: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
c520: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
c530: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c540: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
c550: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
c560: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
c570: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
c580: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
c590: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
c5a0: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
c5b0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
c5c0: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
c5d0: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
c5e0: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
c5f0: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
c600: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
c610: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
c620: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
c630: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
c640: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
c650: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
c660: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
c670: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c680: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
c690: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c6a0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
c6b0: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
c6c0: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
c6d0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
c6e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c6f0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
c700: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
c710: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
c720: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
c730: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
c740: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
c750: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
c760: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c780: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
c790: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
c7a0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
c7d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
c7e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
c800: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
c810: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
c820: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
c830: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
c840: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c850: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
c860: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
c870: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c880: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
c890: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c8a0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
c8b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c8c0: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
c8d0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c8e0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
c8f0: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
c900: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
c910: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c920: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
c930: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
c940: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
c950: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
c960: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
c970: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c980: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
c990: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
c9a0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6a 72 6e  lse.# define jrn
c9b0: 6c 42 75 66 66 65 72 53 69 7a 65 28 78 29 20 30  lBufferSize(x) 0
c9c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c9d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c9e0: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
c9f0: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
ca00: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
ca10: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
ca20: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
ca30: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
ca40: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
ca50: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
ca60: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
ca70: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
ca80: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
ca90: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
caa0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
cab0: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
cac0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
cad0: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
cae0: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
caf0: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
cb00: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
cb10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
cb20: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
cb30: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
cb40: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
cb50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
cb60: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
cb70: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cb80: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
cb90: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
cba0: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
cbb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
cbc0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
cbd0: 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a  )pPage->pData);.
cbe0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
cbf0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
cc00: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
cc10: 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73    pPage->pageHas
cc20: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
cc30: 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  sh(pPage);.}../*
cc40: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
cc50: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
cc60: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
cc70: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
cc80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
cc90: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
cca0: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
ccb0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
ccc0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
ccd0: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
cce0: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
ccf0: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
cd00: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
cd10: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
cd20: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
cd30: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
cd40: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
cd50: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
cd60: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
cd70: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
cd80: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
cd90: 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
cda0: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
cdb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ;.  assert( (pPg
cdc0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
cdd0: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
cde0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
cdf0: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
ce00: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
ce10: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
ce20: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
ce30: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
ce40: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
ce50: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29  _set_pagehash(X)
ce60: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
ce70: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
ce80: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
ce90: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
cea0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
ceb0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
cec0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
ced0: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
cee0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
cef0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
cf00: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
cf10: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cf20: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
cf30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
cf40: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
cf50: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
cf60: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
cf70: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
cf80: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
cf90: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
cfa0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
cfb0: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
cfc0: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
cfd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cfe0: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
cff0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
d000: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
d010: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
d020: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
d030: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
d040: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
d050: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
d060: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
d070: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
d080: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
d090: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
d0a0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
d0b0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
d0c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
d0d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d0e0: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
d0f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
d100: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
d110: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
d120: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
d130: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
d140: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
d150: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
d160: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
d170: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
d180: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d190: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
d1a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d1b0: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
d1c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
d1d0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
d1e0: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
d1f0: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
d200: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
d210: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
d220: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
d230: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
d240: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
d250: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
d260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d270: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
d280: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
d290: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
d2a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d2b0: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
d2c0: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
d2d0: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
d2e0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
d2f0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d300: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
d310: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
d320: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
d330: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
d340: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
d350: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d360: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
d370: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
d380: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
d390: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
d3a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3c0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
d3d0: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3f0: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
d400: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
d410: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
d420: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
d430: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
d440: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
d450: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
d460: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
d470: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
d480: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
d490: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
d4a0: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
d4b0: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
d4d0: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
d4e0: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
d4f0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
d500: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
d510: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
d520: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
d530: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
d540: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
d550: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d560: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
d570: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
d580: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
d590: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
d5a0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
d5b0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
d5c0: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
d5d0: 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20  r .   || len==0 
d5e0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d5f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
d600: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
d610: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
d620: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d630: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d640: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
d650: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
d660: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
d670: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
d680: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d690: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
d6a0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
d6b0: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
d6c0: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
d6d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d6e0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
d6f0: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
d700: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d710: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
d720: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
d730: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
d740: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
d750: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
d760: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
d770: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
d780: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
d790: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
d7a0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
d7b0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
d7c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d7d0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
d7e0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
d7f0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
d800: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
d810: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
d820: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
d830: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
d840: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
d850: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
d860: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
d870: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
d880: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
d890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
d8b0: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
d8c0: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
d8d0: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
d8e0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
d8f0: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
d900: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
d910: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
d920: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
d930: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
d940: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
d950: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
d960: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
d970: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
d980: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
d990: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
d9a0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d9d0: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
d9f0: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
da10: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
da60: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
da70: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
da80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
da90: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
daa0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
dab0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
dac0: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
dad0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
dae0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
daf0: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
db00: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
db10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
db20: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
db30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
db40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
db50: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
db60: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
db70: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
db80: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
db90: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
dba0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
dbb0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
dbc0: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
dbd0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
dbe0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
dbf0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
dc00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
dc10: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
dc20: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
dc30: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
dc40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
dc50: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
dc60: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
dc70: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
dc80: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
dc90: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
dca0: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
dcb0: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
dcc0: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
dcd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
dce0: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
dcf0: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
dd00: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
dd10: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
dd20: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
dd30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
dd40: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
dd50: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
dd60: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
dd70: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
dd80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
dd90: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
dda0: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
ddb0: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
ddc0: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
ddd0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
dde0: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
ddf0: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
de00: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
de10: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
de20: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
de30: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
de40: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
de50: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
de60: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
de70: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
de80: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
de90: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
dea0: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
deb0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
dec0: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
ded0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
dee0: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
def0: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
df00: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
df10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
df20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
df30: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
df40: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
df50: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
df60: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
df70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
df80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
df90: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
dfa0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
dfb0: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
dfc0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dfd0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
e000: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e010: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
e030: 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
e040: 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
e050: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
e060: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e070: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
e080: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
e090: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
e0a0: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
e0b0: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
e0c0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
e0d0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
e0e0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
e0f0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
e100: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
e110: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e120: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e130: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
e140: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
e150: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
e160: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
e170: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e180: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
e190: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
e1a0: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
e1b0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
e1c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e1d0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
e1e0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
e1f0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
e200: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
e210: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
e220: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  Y|pPager->syncFl
e230: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
e240: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e250: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
e260: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
e270: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
e280: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
e290: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
e2a0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
e2b0: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
e2c0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
e2d0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
e2e0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
e2f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e300: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
e310: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
e320: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
e330: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
e340: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
e350: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
e360: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
e370: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
e380: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
e390: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
e3a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e3b0: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
e3c0: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
e3d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e3e0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
e3f0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
e400: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e410: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
e420: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
e430: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e440: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e450: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
e460: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e470: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e480: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
e490: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
e4a0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
e4b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
e4c0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
e4d0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
e4e0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
e4f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
e500: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
e510: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
e520: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
e530: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
e540: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e550: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
e560: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
e570: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
e580: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
e590: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
e5a0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
e5b0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
e5c0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
e5d0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
e5e0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
e5f0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
e600: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
e610: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
e620: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
e630: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
e640: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
e650: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
e660: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
e670: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
e680: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
e690: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
e6a0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
e6b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
e6c0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
e6d0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
e6e0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
e6f0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
e700: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
e710: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e730: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e740: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
e750: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e760: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
e770: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
e780: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
e790: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
e7a0: 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
e7b0: 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66  eSize;/* Size of
e7c0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
e7d0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
e7e0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e800: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e810: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
e820: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
e830: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e860: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
e870: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e880: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
e890: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e8a0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
e8b0: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
e8c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e8d0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
e8e0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
e8f0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
e900: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
e910: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
e920: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
e930: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
e940: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
e950: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
e960: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
e970: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
e980: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
e990: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
e9a0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
e9b0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
e9c0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
e9d0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
e9e0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e9f0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
ea00: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
ea10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
ea20: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
ea30: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
ea40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
ea50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
ea60: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
ea70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ea80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
ea90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
eaa0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
eab0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
eac0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
ead0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
eae0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
eaf0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
eb00: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
eb10: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
eb20: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
eb30: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
eb40: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
eb50: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
eb60: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
eb70: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
eb80: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
eb90: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
eba0: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
ebb0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
ebc0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
ebd0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
ebe0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
ebf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
ec00: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
ec10: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
ec20: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
ec30: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
ec40: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
ec50: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
ec60: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
ec70: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
ec80: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
ec90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eca0: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
ecb0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
ecc0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
ecd0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
ece0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
ecf0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
ed00: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
ed10: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
ed20: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
ed30: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
ed40: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
ed50: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
ed60: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
ed70: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
ed80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
ed90: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
eda0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
edb0: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
edc0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
edd0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
ede0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
edf0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
ee00: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
ee10: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
ee20: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
ee30: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
ee40: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
ee50: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
ee60: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
ee70: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ee80: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
ee90: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
eea0: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
eeb0: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
eec0: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
eed0: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
eee0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
eef0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
ef00: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
ef10: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
ef20: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
ef30: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
ef40: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
ef50: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
ef60: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
ef70: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
ef80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
ef90: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
efa0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
efb0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
efc0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
efd0: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
efe0: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
eff0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f000: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
f010: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
f020: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a  k-hash initializ
f030: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
f040: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f050: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
f060: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
f070: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
f080: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
f090: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f0a0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
f0b0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
f0c0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
f0d0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
f0e0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f0f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f100: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
f110: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
f120: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
f130: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
f140: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
f150: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
f160: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f170: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f180: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
f190: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
f1a0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
f1b0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
f1c0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f1d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
f1e0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
f1f0: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
f200: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
f210: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
f220: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
f230: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
f240: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
f250: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
f260: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
f270: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
f280: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
f290: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
f2a0: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
f2b0: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
f2c0: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
f2d0: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
f2e0: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
f2f0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
f300: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f310: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
f320: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
f330: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
f340: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
f350: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
f360: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
f370: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
f380: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
f390: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
f3a0: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
f3b0: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
f3c0: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
f3d0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
f3e0: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
f3f0: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
f400: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
f410: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
f420: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
f430: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
f440: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
f450: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
f460: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
f470: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
f480: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
f490: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
f4a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
f4b0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
f4c0: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
f4d0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
f4e0: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
f4f0: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
f500: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
f510: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
f520: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f530: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
f540: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
f550: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
f560: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f570: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
f580: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
f590: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
f5a0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
f5b0: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
f5c0: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
f5d0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
f5e0: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
f5f0: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
f600: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
f610: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
f620: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
f630: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
f640: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
f650: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
f660: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
f670: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
f680: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
f690: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
f6a0: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
f6b0: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
f6c0: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
f6d0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f6e0: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
f6f0: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
f700: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
f710: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
f720: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
f730: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
f740: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
f750: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
f760: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
f770: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
f780: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
f790: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
f7a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
f7b0: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
f7c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f7d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f7e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f7f0: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
f800: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
f810: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f820: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
f830: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
f840: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
f850: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
f860: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
f870: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
f880: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
f890: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
f8a0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
f8b0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
f8c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f8d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
f8e0: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
f8f0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f900: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
f910: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
f920: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f930: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
f940: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
f950: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
f960: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
f970: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
f980: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
f990: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
f9a0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
f9b0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
f9c0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
f9d0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
f9e0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
f9f0: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
fa00: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
fa10: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
fa20: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
fa30: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
fa40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
fa50: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
fa60: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
fa70: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
fa80: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
fa90: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
faa0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
fab0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
fac0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
fad0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
fae0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
faf0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
fb00: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
fb10: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
fb20: 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
fb30: 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
fb40: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
fb50: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
fb60: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
fb70: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
fb80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
fb90: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
fba0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
fbb0: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
fbc0: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
fbd0: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
fbe0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
fbf0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
fc00: 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
fc10: 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
fc20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
fc30: 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
fc40: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
fc50: 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
fc80: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
fc90: 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
fca0: 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
fcb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
fcc0: 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
fcd0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
fce0: 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
fcf0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd10: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
fd20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
fd30: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
fd40: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
fd50: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
fd60: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
fd70: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
fd80: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
fd90: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fda0: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
fdb0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
fdc0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
fdd0: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
fde0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
fdf0: 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
fe00: 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
fe10: 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
fe20: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
fe30: 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
fe40: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
fe50: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
fe60: 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
fe70: 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
fe80: 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
fe90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
fea0: 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
feb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
fec0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
fed0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
fee0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fef0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
ff00: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
ff10: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
ff20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
ff30: 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
ff40: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
ff50: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
ff60: 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
ff70: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
ff80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
ff90: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
ffa0: 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
ffb0: 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
ffc0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
ffd0: 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
ffe0: 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
fff0: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
10000 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
10010 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
10020 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
10030 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
10040 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
10050 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
10060 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
10070 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
10080 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
10090 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
100a0 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
100b0 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
100c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
100d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
100e0 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
100f0 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
10100 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
10110 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
10120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10130 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
10140 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
10150 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
10160 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
10170 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
10180 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
10190 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
101a0 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
101b0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
101c0 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
101d0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
101e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
101f0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
10200 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
10210 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
10220 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10230 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10240 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10250 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
10260 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
10270 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10280 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10290 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
102a0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
102b0 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
102c0 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
102d0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
102e0 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
102f0 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
10300 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10310 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
10320 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
10330 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10350 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
10360 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
10370 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
10380 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
10390 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
103a0 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
103b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
103c0 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
103d0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
103e0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
103f0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
10400 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
10410 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10420 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
10430 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10440 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
10450 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
10460 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
10470 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10480 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
10490 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
104a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
104b0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
104c0 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53  /* Versions of S
104d0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
104e0 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67  .5.8 set the pag
104f0 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
10500 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
10510 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72  al header to zer
10520 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  o. In this case,
10530 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
10540 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
10550 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
10560 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
10570 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  o the correct pa
10580 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  ge size..    */.
10590 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
105a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  e==0 ){.      iP
105b0 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
105c0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
105d0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
105e0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
105f0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
10600 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
10610 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
10620 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
10630 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
10640 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
10650 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
10660 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
10670 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
10680 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
10690 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
106a0 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
106b0 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
106c0 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
106d0 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
106e0 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
106f0 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
10700 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
10710 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
10720 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
10730 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10740 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
10750 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
10760 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
10770 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
10780 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
10790 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
107a0 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
107b0 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
107c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
107d0 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
107e0 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
107f0 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
10800 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
10810 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
10820 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
10830 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
10840 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
10850 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
10860 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
10870 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
10880 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
10890 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
108a0 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
108b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
108c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
108d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
108e0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
108f0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
10900 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
10910 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
10920 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10930 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
10940 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
10950 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
10960 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
10970 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
10980 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
10990 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
109a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
109b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
109c0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
109d0 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b  &iPageSize, -1);
109e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
109f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
10a00 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
10a10 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
10a20 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
10a30 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
10a40 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
10a50 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
10a60 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
10a70 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
10a80 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
10a90 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
10aa0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
10ab0 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
10ac0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
10ad0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
10ae0 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
10af0 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
10b00 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
10b10 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
10b20 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
10b30 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
10b40 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
10b50 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
10b60 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
10b70 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
10b80 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
10b90 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
10ba0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10bb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10bc0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
10bd0 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
10be0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10bf0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
10c00 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
10c10 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
10c20 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
10c30 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
10c40 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
10c50 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
10c60 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
10c70 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10c80 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
10c90 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
10ca0 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
10cb0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10cc0 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
10cd0 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
10ce0 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
10cf0 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
10d00 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
10d10 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
10d20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
10d30 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
10d40 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
10d50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
10d60 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
10d70 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
10d80 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
10d90 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
10da0 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
10db0 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
10dc0 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
10dd0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
10de0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
10df0 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
10e00 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
10e10 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10e20 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
10e30 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
10e40 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
10e50 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
10e60 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
10e70 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
10e80 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
10e90 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
10ea0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
10eb0 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
10ec0 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
10ed0 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
10ee0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
10ef0 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
10f00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10f10 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
10f20 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
10f30 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10f40 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10f50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10f80 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
10f90 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
10fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
10fb0 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
10fc0 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
10fd0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
10fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10ff0 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
11000 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
11010 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
11020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11030 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
11050 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
11060 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
11070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
11080 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
11090 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61   zMaster */..  a
110a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
110b0 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
110c0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
110d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
110e0 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
110f0 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
11100 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
11110 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11120 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73  EMORY .   || !is
11130 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11140 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
11150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11160 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
11170 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
11180 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
11190 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
111a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
111b0 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
111c0 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
111d0 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
111e0 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
111f0 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
11200 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
11210 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
11220 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
11230 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
11240 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
11250 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
11260 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
11270 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
11280 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
11290 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
112a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
112b0 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
112c0 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
112d0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
112e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
112f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
11300 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
11310 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
11320 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11330 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
11340 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
11350 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
11360 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
11370 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
11380 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
11390 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
113a0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
113b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
113c0 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
113d0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
113e0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
113f0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
11400 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
11410 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11420 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11430 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
11440 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
11450 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
11460 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
11470 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
11480 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
11490 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
114a0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
114b0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
114c0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
114d0 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
114e0 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
114f0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11500 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11510 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11520 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
11530 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11540 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11550 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
11560 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20  rnalMagic, 8,.  
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
11590 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
115a0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
115b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
115c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
115d0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
115e0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
115f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
11600 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
11610 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
11620 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
11630 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
11640 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
11650 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
11660 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
11670 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
11680 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
11690 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
116a0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
116b0 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
116c0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
116d0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
116e0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
116f0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
11700 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
11710 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
11720 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
11730 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
11740 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
11750 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
11760 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
11770 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
11780 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
11790 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
117a0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
117b0 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
117c0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
117d0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
117e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
117f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
11800 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
11810 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
11820 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
11830 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
11840 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
11850 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
11870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11880 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
11890 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
118a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
118b0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
118c0 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
118d0 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
118e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
118f0 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56    pPager->iDataV
11900 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69  ersion++;.  sqli
11910 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
11920 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
11930 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
11940 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
11950 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
11960 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50  ** Return the pP
11970 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11980 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20  on value.*/.u32 
11990 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61  sqlite3PagerData
119a0 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70  Version(Pager *p
119b0 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
119c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
119d0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  >PAGER_OPEN );. 
119e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
119f0 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a  iDataVersion;.}.
11a00 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11a10 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11a20 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11a30 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11a40 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11a50 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11a60 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11a70 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11a80 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11a90 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
11aa0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
11ab0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11ac0 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11ad0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11ae0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
11af0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11b00 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11b10 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11b20 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11b30 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11b40 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11b50 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11b60 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11b70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11b80 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11b90 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
11ba0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
11bb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11bc0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11bd0 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75  de || sqlite3Jou
11be0 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
11bf0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11c00 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11c10 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11c20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11c30 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11c40 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11c50 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11c60 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11c70 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11c80 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11c90 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
11ca0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
11cb0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
11cc0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
11cd0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
11ce0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
11cf0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11d00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11d10 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11d20 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11d30 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11d40 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11d50 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11d60 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11d70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11d80 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11d90 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11da0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11db0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11dc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11dd0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11de0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
11df0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11e00 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11e10 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11e20 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11e30 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11e40 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11e50 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11e60 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11e70 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11e80 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11e90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11ea0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11eb0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
11ec0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11ed0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
11ee0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
11ef0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11f00 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11f10 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
11f20 54 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20  T./*.** If they 
11f30 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 2c  are not already,
11f40 20 62 65 67 69 6e 20 72 65 63 6f 72 64 69 6e 67   begin recording
11f50 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20   all pages read 
11f60 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
11f70 61 79 65 72 0a 2a 2a 20 62 79 20 74 68 65 20 62  ayer.** by the b
11f80 2d 74 72 65 65 20 6c 61 79 65 72 20 54 68 69 73  -tree layer This
11f90 20 69 73 20 75 73 65 64 20 62 79 20 63 6f 6e 63   is used by conc
11fa0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
11fb0 6f 6e 73 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53  ons. Return.** S
11fc0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11fd0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
11fe0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
11ff0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69  (SQLITE_NOMEM) i
12000 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
12010 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
12020 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f  ite3PagerBeginCo
12030 6e 63 75 72 72 65 6e 74 28 50 61 67 65 72 20 2a  ncurrent(Pager *
12040 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
12050 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12060 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
12070 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lRead==0 ){.    
12080 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
12090 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
120a0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
120b0 62 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  bSize);.    pPag
120c0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
120d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
120e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
120f0 3e 70 41 6c 6c 52 65 61 64 3d 3d 30 20 29 7b 0a  >pAllRead==0 ){.
12100 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12110 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
12120 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12130 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  }../* !defined(S
12140 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
12150 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 53 74 6f  RRENT).**.** Sto
12160 70 20 72 65 63 6f 72 64 69 6e 67 20 61 6c 6c 20  p recording all 
12170 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
12180 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
12190 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
121a0 79 65 72 0a 2a 2a 20 61 6e 64 20 64 69 73 63 61  yer.** and disca
121b0 72 64 20 61 6e 79 20 63 75 72 72 65 6e 74 20 72  rd any current r
121c0 65 63 6f 72 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ecords..*/.void 
121d0 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e 64 43  sqlite3PagerEndC
121e0 6f 6e 63 75 72 72 65 6e 74 28 50 61 67 65 72 20  oncurrent(Pager 
121f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
12200 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
12210 28 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61  (pPager->pAllRea
12220 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41  d);.  pPager->pA
12230 6c 6c 52 65 61 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  llRead = 0;.}../
12240 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
12250 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
12260 54 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T).**.** Return 
12270 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
12280 62 61 73 65 20 69 73 20 69 6e 20 77 61 6c 20 6d  base is in wal m
12290 6f 64 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72  ode. False other
122a0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
122b0 69 74 65 33 50 61 67 65 72 49 73 57 61 6c 28 50  ite3PagerIsWal(P
122c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
122d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
122e0 70 57 61 6c 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69  pWal!=0;.}.#endi
122f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12300 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a  _CONCURRENT */..
12310 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 50  /*.** Free the P
12320 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
12330 61 6e 64 20 50 61 67 65 72 2e 70 41 6c 6c 52 65  and Pager.pAllRe
12340 61 64 20 62 69 74 76 65 63 20 6f 62 6a 65 63 74  ad bitvec object
12350 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12360 64 20 70 61 67 65 72 46 72 65 65 42 69 74 76 65  d pagerFreeBitve
12370 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
12380 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ){.  sqlite3Bitv
12390 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
123a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
123b0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
123c0 6e 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  nal = 0;.  sqlit
123d0 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72  e3PagerEndConcur
123e0 72 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  rent(pPager);.}.
123f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12400 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
12410 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
12420 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12430 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
12440 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
12450 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
12460 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
12470 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
12480 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
12490 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
124a0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
124b0 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
124c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
124d0 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
124e0 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
124f0 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
12500 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
12510 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
12520 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
12530 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
12540 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
12550 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12560 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
12570 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
12580 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
12590 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
125a0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
125b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
125c0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
125d0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
125e0 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
125f0 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
12600 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
12610 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
12620 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
12630 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
12640 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
12650 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
12660 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
12670 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
12680 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
12690 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
126a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
126b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
126c0 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
126d0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
126e0 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
126f0 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
12700 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
12710 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12720 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
12730 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
12740 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12750 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
12760 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
12770 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12780 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
12790 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
127a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
127b0 52 20 0a 20 20 29 3b 0a 0a 20 20 70 61 67 65 72  R .  );..  pager
127c0 46 72 65 65 42 69 74 76 65 63 73 28 70 50 61 67  FreeBitvecs(pPag
127d0 65 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c  er);.  releaseAl
127e0 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
127f0 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65  er);..  if( page
12800 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
12810 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
12820 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
12830 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  fd) );.    sqlit
12840 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
12850 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
12860 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  pWal);.    pPage
12870 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12880 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  R_OPEN;.  }else 
12890 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
128a0 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
128b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65  /* Error code re
128e0 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55  turned by pagerU
128f0 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20  nlockDb() */.   
12900 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65   int iDc = isOpe
12910 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71  n(pPager->fd)?sq
12920 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
12930 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
12940 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20  ger->fd):0;..   
12950 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61   /* If the opera
12960 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70  ting system supp
12970 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20  ort deletion of 
12980 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e  open files, then
12990 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68  .    ** close th
129a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
129b0 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65  hen dropping the
129c0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20   database lock. 
129d0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
129e0 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  * another connec
129f0 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61  tion with journa
12a00 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69  l_mode=delete mi
12a10 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66  ght delete the f
12a20 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66  ile.    ** out f
12a30 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20  rom under us..  
12a40 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
12a50 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12a60 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35  ODE_MEMORY   & 5
12a70 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12a80 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12a90 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
12aa0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12ab0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12ac0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
12ad0 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12ae0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12af0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
12b00 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ETE   & 5)!=1 );
12b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12b20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12b30 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31  TRUNCATE & 5)==1
12b40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12b50 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12b60 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29  DE_PERSIST  & 5)
12b70 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==1 );.    if( 0
12b80 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ==(iDc & SQLITE_
12b90 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
12ba0 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20  E_WHEN_OPEN).   
12bb0 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d    || 1!=(pPager-
12bc0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35  >journalMode & 5
12bd0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
12be0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
12bf0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
12c00 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
12c10 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
12c20 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
12c30 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c   the call to unl
12c40 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
12c50 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69  .    ** file fai
12c60 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72  ls, set the curr
12c70 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e  ent lock to UNKN
12c80 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68  OWN_LOCK. See th
12c90 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a  e comment.    **
12ca0 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
12cb0 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c  ne for UNKNOWN_L
12cc0 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
12cd0 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68  nation of why th
12ce0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63  is.    ** is nec
12cf0 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
12d00 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c     rc = pagerUnl
12d10 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f  ockDb(pPager, NO
12d20 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
12d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
12d40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
12d50 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a  =PAGER_ERROR ){.
12d60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
12d70 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ock = UNKNOWN_LO
12d80 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
12d90 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74  * The pager stat
12da0 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64  e may be changed
12db0 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f   from PAGER_ERRO
12dc0 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  R to PAGER_OPEN 
12dd0 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68  here.    ** with
12de0 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65  out clearing the
12df0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69   error code. Thi
12e00 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c  s is intentional
12e10 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20   - the error.   
12e20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61   ** code is clea
12e30 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  red and the cach
12e40 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62  e reset in the b
12e50 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20  lock below..    
12e60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
12e70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
12e80 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12e90 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
12ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12eb0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
12ec0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12ed0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
12ee0 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  N;.  }..  /* If 
12ef0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
12f00 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
12f10 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
12f20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
12f30 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
12f40 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  w that there are
12f50 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
12f60 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
12f70 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74  e pager,.  ** it
12f80 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65   can safely move
12f90 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f   back to PAGER_O
12fa0 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20  PEN state. This 
12fb0 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a  happens in both.
12fc0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20    ** normal and 
12fd0 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e  exclusive-lockin
12fe0 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  g mode..  */.  a
12ff0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13000 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
13010 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
13020 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
13030 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Code ){.    if( 
13040 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ==0 ){.      pag
13060 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
13070 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13080 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
13090 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
130a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
130b0 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73  R_OPEN;.    }els
130c0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
130d0 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70 65  >eState = (isOpe
130e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 3f  n(pPager->jfd) ?
130f0 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50 41   PAGER_OPEN : PA
13100 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20 20  GER_READER);.   
13110 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46 45   }.    if( USEFE
13120 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
13130 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
13140 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
13150 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
13160 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
13170 4b 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65 72  K;.    setGetter
13180 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a  Method(pPager);.
13190 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
131a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
131b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
131c0 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
131d0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
131e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
131f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13200 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
13210 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
13220 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
13230 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
13240 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
13250 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
13260 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
13270 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
13280 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
13290 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
132a0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
132b0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
132c0 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
132d0 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
132e0 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
132f0 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
13300 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
13310 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
13320 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
13330 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
13340 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
13350 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
13360 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
13370 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
13380 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
13390 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
133a0 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
133b0 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
133c0 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
133d0 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
133e0 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
133f0 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
13400 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
13410 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
13420 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
13430 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
13440 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
13450 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
13460 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
13470 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
13480 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
13490 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
134a0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
134b0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
134c0 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
134d0 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
134e0 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
134f0 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
13500 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
13510 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
13520 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
13530 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
13540 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
13550 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
13560 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
13570 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
13580 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
13590 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
135a0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
135b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
135c0 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
135d0 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
135e0 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
135f0 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
13600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13610 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
13620 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
13630 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
13640 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
13650 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
13660 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
13670 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
13680 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
13690 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
136a0 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
136b0 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
136c0 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
136d0 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
136e0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
136f0 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
13700 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
13710 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13720 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
13730 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
13740 52 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 65 74  R_ERROR;.    set
13750 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61  GetterMethod(pPa
13760 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
13770 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
13780 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
13790 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
137a0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a  r, Pgno nPage);.
137b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74 65  ./*.** The write
137c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
137d0 6e 20 6f 6e 20 70 50 61 67 65 72 20 69 73 20 62  n on pPager is b
137e0 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 20 28  eing committed (
137f0 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a 2a 20 6f  bCommit==1).** o
13800 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 28 62  r rolled back (b
13810 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a  Commit==0)..**.*
13820 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13830 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6c 6c   and only if all
13840 20 64 69 72 74 79 20 70 61 67 65 73 20 73 68 6f   dirty pages sho
13850 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64 20 74  uld be flushed t
13860 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75  o disk..**.** Ru
13870 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  les:.**.**   *  
13880 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20 64 61 74  For non-TEMP dat
13890 61 62 61 73 65 73 2c 20 61 6c 77 61 79 73 20 73  abases, always s
138a0 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ync to disk.  Th
138b0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a  is is necessary.
138c0 2a 2a 20 20 20 20 20 20 66 6f 72 20 74 72 61 6e  **      for tran
138d0 73 61 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  sactions to be d
138e0 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  urable..**.**   
138f0 2a 20 20 53 79 6e 63 20 54 45 4d 50 20 64 61 74  *  Sync TEMP dat
13900 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e 20 61 20  abase only on a 
13910 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61 20 52 4f  COMMIT (not a RO
13920 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20 74 68 65  LLBACK) when the
13930 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   backing.**     
13940 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
13950 72 65 61 74 65 64 20 61 6c 72 65 61 64 79 20 28  reated already (
13960 76 69 61 20 61 20 73 70 69 6c 6c 20 6f 6e 20 70  via a spill on p
13970 61 67 65 72 53 74 72 65 73 73 28 29 29 20 61 6e  agerStress()) an
13980 64 0a 2a 2a 20 20 20 20 20 20 77 68 65 6e 20 74  d.**      when t
13990 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 72  he number of dir
139a0 74 79 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ty pages in memo
139b0 72 79 20 65 78 63 65 65 64 73 20 32 35 25 20 6f  ry exceeds 25% o
139c0 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a 2a 20 20  f the total.**  
139d0 20 20 20 20 63 61 63 68 65 20 73 69 7a 65 2e 0a      cache size..
139e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
139f0 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74  gerFlushOnCommit
13a00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13a10 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
13a20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
13a30 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  File==0 ) return
13a40 20 31 3b 0a 20 20 69 66 28 20 21 62 43 6f 6d 6d   1;.  if( !bComm
13a50 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  it ) return 0;. 
13a60 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
13a70 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72  ger->fd) ) retur
13a80 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 28 73  n 0;.  return (s
13a90 71 6c 69 74 65 33 50 43 61 63 68 65 50 65 72 63  qlite3PCachePerc
13aa0 65 6e 74 44 69 72 74 79 28 70 50 61 67 65 72 2d  entDirty(pPager-
13ab0 3e 70 50 43 61 63 68 65 29 3e 3d 32 35 29 3b 0a  >pPCache)>=25);.
13ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
13ad0 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
13ae0 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
13af0 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
13b00 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
13b10 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
13b20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
13b30 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
13b40 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
13b50 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
13b60 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
13b70 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
13b80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
13b90 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
13ba0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13bb0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
13bc0 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
13bd0 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
13be0 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
13bf0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54  action..** .** T
13c00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
13c10 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50  ever called in P
13c20 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
13c30 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65  . If it is calle
13c40 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f  d.** in PAGER_NO
13c50 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52  NE or PAGER_SHAR
13c60 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  ED state and the
13c70 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65   lock held is le
13c80 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  ss.** exclusive 
13c90 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20  than a RESERVED 
13ca0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f  lock, it is a no
13cb0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  -op..**.** Other
13cc0 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65  wise, any active
13cd0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
13ce0 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
13cf0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
13d00 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ile is open, the
13d10 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a  n it is "finaliz
13d20 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72  ed". Once a jour
13d30 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73  nal .** file has
13d40 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
13d50 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
13d60 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20  le to use it to 
13d70 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20  roll back a .** 
13d80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72  transaction. Nor
13d90 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73   will it be cons
13da0 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68  idered to be a h
13db0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68  ot-journal by th
13dc0 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68  is.** or any oth
13dd0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
13de0 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20  ection. Exactly 
13df0 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73  how a journal is
13e00 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65   finalized.** de
13e10 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
13e20 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65   or not the page
13e30 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
13e40 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
13e50 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  nd.** the curren
13e60 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28  t journal-mode (
13e70 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
13e80 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c  e value), as fol
13e90 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  lows:.**.**   jo
13ea0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13eb0 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  Y.**     Journal
13ec0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13ed0 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65   is simply close
13ee0 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73  d. This destroys
13ef0 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d   an .**     in-m
13f00 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  emory journal..*
13f10 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13f20 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20  de==TRUNCATE.** 
13f30 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
13f40 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
13f50 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
13f60 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ize..**.**   jou
13f70 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
13f80 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72  T.**     The fir
13f90 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74  st 28 bytes of t
13fa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13fb0 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73  are zeroed. This
13fc0 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20   invalidates.** 
13fd0 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f      the first jo
13fe0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
13ff0 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65  the file, and he
14000 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  nce the entire j
14010 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
14020 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a  le. An invalid j
14030 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e  ournal file cann
14040 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
14050 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  k..**.**   journ
14060 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a  alMode==DELETE.*
14070 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  *     The journa
14080 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
14090 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69   and deleted usi
140a0 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
140b0 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te()..**.**     
140c0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
140d0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
140e0 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20  sive mode, this 
140f0 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69  method of finali
14100 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20  zing.**     the 
14110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
14120 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74  never used. Inst
14130 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  ead, if the jour
14140 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20  nalMode is.**   
14150 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65    DELETE and the
14160 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
14170 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
14180 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
14190 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a  d under.**     j
141a0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
141b0 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74  IST is used inst
141c0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ead..**.** After
141d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
141e0 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70  finalized, the p
141f0 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
14200 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
14210 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20  ..** If running 
14220 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65  in non-exclusive
14230 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20   rollback mode, 
14240 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
14250 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e  file is .** down
14260 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52  graded to a SHAR
14270 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53  ED_LOCK..**.** S
14280 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14290 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
142a0 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
142b0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
142c0 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
142d0 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
142e0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
142f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
14300 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
14310 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
14320 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
14330 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
14340 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
14350 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
14360 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
14370 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
14380 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
14390 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
143a0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
143b0 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
143c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
143d0 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
143e0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
143f0 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
14400 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
14410 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
14420 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
14430 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
14440 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
14450 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
14460 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
14470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
14480 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14490 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
144a0 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 2c  , int hasMaster,
144b0 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
144c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
144d0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72  _OK;      /* Err
144e0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75  or code from jou
144f0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
14500 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
14510 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
14520 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72  E_OK;     /* Err
14530 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20  or code from db 
14540 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  file unlock oper
14550 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44  ation */..  /* D
14560 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65  o nothing if the
14570 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
14580 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
14590 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te transaction. 
145a0 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20   ** or at least 
145b0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
145c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
145d0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ay be called whe
145e0 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  n there.  ** is 
145f0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
14600 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20  tion active but 
14610 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
14620 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20  eater lock is.  
14630 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77  ** held under tw
14640 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
14650 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
14660 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  After a successf
14670 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ul hot-journal r
14680 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63  ollback, it is c
14690 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
146a0 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47       eState==PAG
146b0 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63  ER_NONE and eLoc
146c0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
146d0 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  K..  **.  **   2
146e0 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f  . If a connectio
146f0 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d  n with locking_m
14700 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f  ode=exclusive ho
14710 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
14720 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f  VE .  **      lo
14730 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b  ck switches back
14740 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   to locking_mode
14750 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e  =normal and then
14760 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a   executes a.  **
14770 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73        read-trans
14780 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e  action, this fun
14790 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
147a0 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47  with eState==PAG
147b0 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20  ER_READER .  ** 
147c0 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d       and eLock==
147d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77  EXCLUSIVE_LOCK w
147e0 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61  hen the read-tra
147f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
14800 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
14810 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
14820 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
14830 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
14840 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14850 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20  _ERROR );.  if( 
14860 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
14870 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14880 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  ED && pPager->eL
14890 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43  ock<RESERVED_LOC
148a0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
148b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
148c0 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
148d0 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
148e0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
148f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
14900 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
14910 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
14920 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
14930 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
14940 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
14950 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
14960 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
14970 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
14980 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14990 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
149a0 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  y(pPager->jfd) )
149b0 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  {.      /* asser
149c0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
149d0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
149e0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
149f0 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c   ); */.      sql
14a00 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
14a10 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
14a20 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
14a30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14a40 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
14a50 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
14a60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
14a70 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
14a80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14a90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
14aa0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
14ab0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
14ac0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
14ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14af0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
14b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
14b10 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
14b20 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  ew file size is 
14b30 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14b40 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61   inode right awa
14b50 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y..          ** 
14b60 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f  Otherwise the jo
14b70 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75  urnal might resu
14b80 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  rrect following 
14b90 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64  a power loss and
14ba0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
14bb0 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72 61  use the last tra
14bc0 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c  nsaction to roll
14bd0 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20   back.  See.    
14be0 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f        ** https:/
14bf0 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c  /bugzilla.mozill
14c00 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63  a.org/show_bug.c
14c10 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20  gi?id=1072773.  
14c20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14c30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14c40 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
14c50 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
14c60 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
14c70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14c80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14c90 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
14ca0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
14cb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14cc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
14cd0 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
14ce0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14cf0 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
14d00 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
14d10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14d20 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
14d30 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
14d40 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
14d50 73 4d 61 73 74 65 72 7c 7c 70 50 61 67 65 72 2d  sMaster||pPager-
14d60 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
14d70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14d80 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
14d90 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
14da0 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
14db0 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
14dc0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
14dd0 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
14de0 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
14df0 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
14e00 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
14e10 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
14e20 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
14e30 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
14e40 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
14e50 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
14e60 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
14e70 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
14e80 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
14e90 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
14ea0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
14eb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14ec0 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70  int bDelete = !p
14ed0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
14ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
14ef0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
14f00 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
14f10 6a 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  jfd)==0 );.     
14f20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14f30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14f40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14f50 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
14f60 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
14f70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14f80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
14f90 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
14fa0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14fb0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14fc0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
14fd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
14fe0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
14ff0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
15000 20 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a   if( bDelete ){.
15010 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15020 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
15030 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
15040 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
15050 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b  ger->extraSync);
15060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15070 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
15080 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
15090 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
150a0 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
150b0 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
150c0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
150d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
150e0 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  Size==0 && sqlit
150f0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
15100 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15110 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  )>0 ){.    PgHdr
15120 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67   *p = sqlite3Pag
15130 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
15140 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   1);.    if( p )
15150 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48  {.      p->pageH
15160 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ash = 0;.      s
15170 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
15180 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20  NotNull(p);.    
15190 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
151a0 70 61 67 65 72 46 72 65 65 42 69 74 76 65 63 73  pagerFreeBitvecs
151b0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
151c0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
151d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
151e0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d  K ){.    if( MEM
151f0 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68  DB || pagerFlush
15200 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c  OnCommit(pPager,
15210 20 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20   bCommit) ){.   
15220 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15230 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
15240 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d  >pPCache);.    }
15250 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
15260 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 57 72  te3PcacheClearWr
15270 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70  itable(pPager->p
15280 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20  PCache);.    }. 
15290 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
152a0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
152b0 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
152c0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
152d0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
152e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
152f0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
15300 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
15310 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
15320 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
15330 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
15340 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
15350 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
15360 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
15370 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
15380 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
15390 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
153a0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
153b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
153c0 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
153d0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
153e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
153f0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
15400 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
15410 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
15420 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
15430 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
15440 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
15450 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
15460 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
15470 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
15480 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
15490 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
154a0 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
154b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
154c0 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
154d0 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
154e0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
154f0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
15500 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
15510 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
15520 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15530 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
15540 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
15550 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
15560 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
15570 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
15580 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
15590 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
155a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
155b0 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
155c0 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
155d0 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
155e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
155f0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
15600 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
15610 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
15620 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
15630 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
15640 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15650 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
15660 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
15670 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
15680 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
15690 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
156a0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
156b0 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
156c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
156d0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
156e0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
156f0 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
15700 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
15710 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
15720 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
15730 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
15740 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
15750 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
15760 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
15770 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
15780 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
15790 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
157a0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
157b0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
157c0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
157d0 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
157e0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
157f0 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
15800 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
15810 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
15820 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
15830 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
15840 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
15850 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
15860 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
15870 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
15880 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
15890 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
158a0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
158b0 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
158c0 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
158d0 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
158e0 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
158f0 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
15900 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
15910 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
15920 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
15930 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
15940 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15950 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
15960 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
15970 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
15980 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
15990 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
159a0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
159b0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
159c0 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
159d0 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
159e0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
159f0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
15a00 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
15a10 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
15a20 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
15a30 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
15a40 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
15a50 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
15a60 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
15a70 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
15a80 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
15a90 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
15aa0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
15ab0 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
15ac0 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
15ad0 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
15ae0 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
15af0 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
15b00 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
15b10 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
15b20 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
15b30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
15b40 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
15b50 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
15b60 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
15b70 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
15b80 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
15b90 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
15ba0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
15bb0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
15bc0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
15bd0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
15be0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15bf0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
15c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
15c10 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
15c20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15c30 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
15c40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
15c50 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
15c60 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
15c70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
15c80 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
15c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15ca0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
15cb0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
15cc0 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
15cd0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
15ce0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
15cf0 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
15d00 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
15d10 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
15d20 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
15d30 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
15d40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
15d50 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
15d60 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
15d70 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
15d80 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
15d90 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
15da0 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
15db0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15dc0 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
15dd0 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
15de0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
15df0 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
15e00 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
15e10 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
15e20 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
15e30 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
15e40 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
15e50 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
15e60 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
15e70 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
15e80 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
15e90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
15ea0 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
15eb0 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
15ec0 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
15ed0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
15ee0 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
15ef0 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
15f00 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
15f10 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
15f20 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
15f30 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
15f40 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
15f50 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
15f60 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
15f70 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
15f80 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
15f90 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
15fa0 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
15fb0 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
15fc0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
15fd0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
15fe0 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
15ff0 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
16000 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
16010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
16020 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
16030 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
16040 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
16050 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
16060 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
16070 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
16080 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
16090 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
160a0 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
160b0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
160c0 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
160d0 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
160e0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
160f0 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
16100 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
16110 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
16120 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
16130 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
16140 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
16150 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
16160 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
16170 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
16180 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
16190 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
161a0 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
161b0 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
161c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
161d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
161e0 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
161f0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
16200 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
16210 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
16220 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16230 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
16240 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16250 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16260 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
16270 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
16280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
16290 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
162a0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
162b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
162e0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
162f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
16300 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
16310 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
16320 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
16330 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
16340 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  ec */.#endif..#i
16350 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16360 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  CODEC./*.** Make
16370 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72   sure the number
16380 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74   of reserved bit
16390 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e  s is the same in
163a0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
163b0 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20  .** pager as it 
163c0 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  is in the source
163d0 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70  .  This comes up
163e0 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63   when a VACUUM c
163f0 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75  hanges the.** nu
16400 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
16410 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70   bits to the "op
16420 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a  timal" amount..*
16430 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
16440 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28  gerAlignReserve(
16450 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61  Pager *pDest, Pa
16460 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66  ger *pSrc){.  if
16470 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76  ( pDest->nReserv
16480 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76  e!=pSrc->nReserv
16490 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  e ){.    pDest->
164a0 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d  nReserve = pSrc-
164b0 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  >nReserve;.    p
164c0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
164d0 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Dest);.  }.}.#en
164e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
164f0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
16500 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
16510 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
16520 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
16530 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
16540 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
16550 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
16560 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
16570 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
16580 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
16590 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
165a0 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
165b0 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
165c0 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
165d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
165e0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
165f0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
16600 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
16610 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
16620 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
16630 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
16640 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
16650 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
16660 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
16670 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
16680 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
16690 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
166a0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
166b0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
166c0 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
166d0 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
166e0 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
166f0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
16700 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
16710 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
16720 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
16730 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
16740 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
16750 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
16760 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
16770 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
16780 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
16790 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
167a0 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
167b0 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
167c0 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
167d0 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
167e0 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
167f0 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
16800 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
16810 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
16820 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
16830 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
16840 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
16850 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
16860 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
16870 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
16880 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
16890 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
168a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
168b0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
168c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
168d0 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
168e0 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
168f0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16900 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
16910 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
16920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16930 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
16940 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
16950 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
16960 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
16970 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
16980 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
16990 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
169a0 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
169b0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
169c0 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
169d0 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
169e0 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
169f0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
16a00 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
16a10 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
16a20 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
16a30 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
16a40 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
16a50 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
16a60 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
16a70 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
16a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
16a90 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
16aa0 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
16ab0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
16ac0 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
16ad0 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
16ae0 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
16af0 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
16b00 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
16b10 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
16b20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
16b30 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
16b40 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
16b50 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
16b60 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
16b70 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
16b80 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
16b90 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
16ba0 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
16bb0 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
16bc0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
16bd0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16be0 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
16bf0 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
16c00 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
16c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16c20 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
16c30 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
16c40 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c60 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
16c70 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
16c80 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ca0 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
16cb0 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
16cc0 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
16cd0 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
16ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
16cf0 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
16d00 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
16d10 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
16d20 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
16d30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
16d40 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
16d50 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
16d60 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
16d70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
16d80 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
16d90 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
16da0 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
16db0 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
16dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16dd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16de0 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
16df0 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
16e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16e10 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
16e20 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
16e30 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
16e40 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16e60 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
16e70 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
16e80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
16e90 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
16ea0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
16eb0 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
16ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
16ed0 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
16f00 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
16f10 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed */.#ifdef SQL
16f20 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
16f30 2f 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66  /* The jrnlEnc f
16f40 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 4a  lag is true if J
16f50 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f  ournal pages sho
16f60 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
16f70 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63  rough.  ** the c
16f80 6f 64 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c  odec.  It is fal
16f90 73 65 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d  se for pure in-m
16fa0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20  emory journals. 
16fb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a  */.  const int j
16fc0 72 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e  rnlEnc = (isMain
16fd0 4a 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Jrnl || pPager->
16fe0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29  subjInMemory==0)
16ff0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
17000 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
17010 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
17020 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
17030 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
17040 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
17050 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
17060 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
17070 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
17080 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
17090 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
170a0 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
170b0 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
170c0 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
170d0 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
170e0 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
170f0 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
17100 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
17110 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
17120 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
17130 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
17140 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
17150 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
17160 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
17170 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
17180 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
17190 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
171a0 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
171b0 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
171c0 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
171d0 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
171e0 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
171f0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
17200 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
17210 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
17220 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
17230 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
17240 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
17250 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
17260 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
17270 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
17280 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17290 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
172a0 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
172b0 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
172c0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
172d0 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
172e0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
172f0 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
17300 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
17310 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
17320 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
17330 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
17340 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
17350 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
17360 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
17370 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
17380 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
17390 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
173a0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
173b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
173c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
173d0 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
173e0 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
173f0 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
17400 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
17410 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
17420 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
17430 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
17440 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
17450 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
17460 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
17470 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
17480 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
17490 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
174a0 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
174b0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
174c0 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
174d0 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
174e0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
174f0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
17500 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
17510 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
17520 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
17530 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
17540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17550 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
17560 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
17570 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
17580 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
17590 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
175a0 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
175b0 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
175c0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
175d0 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
175e0 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
175f0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
17600 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
17610 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
17620 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
17630 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
17640 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
17650 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
17660 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
17670 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
17680 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
17690 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
176a0 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
176b0 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
176c0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
176d0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
176e0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
176f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
17700 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
17710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17720 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
17730 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
17740 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
17750 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
17760 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
17770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17780 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
17790 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
177a0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
177b0 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
177c0 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
177d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
177e0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
177f0 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
17800 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
17810 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
17820 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
17830 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
17840 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
17850 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
17860 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
17870 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72   back before dur
17880 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
17890 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
178a0 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
178b0 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
178c0 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
178d0 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
178e0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
178f0 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
17900 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17910 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17920 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
17930 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
17940 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
17950 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
17960 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
17970 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
17980 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
17990 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
179a0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
179b0 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
179c0 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
179d0 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
179e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
179f0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
17a00 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
17a10 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
17a20 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
17a30 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
17a40 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
17a50 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
17a60 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
17a70 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
17a80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17a90 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
17aa0 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
17ab0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
17ac0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
17ad0 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
17ae0 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
17af0 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
17b00 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
17b10 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
17b20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
17b30 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
17b40 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
17b50 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
17b60 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
17b70 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
17b80 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
17b90 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
17ba0 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
17bb0 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
17bc0 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
17bd0 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
17be0 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
17bf0 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
17c00 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
17c10 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
17c20 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
17c30 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
17c40 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
17c50 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
17c60 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
17c70 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
17c80 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
17c90 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
17ca0 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
17cb0 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
17cc0 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
17cd0 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
17ce0 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
17cf0 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
17d00 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
17d10 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
17d20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
17d30 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
17d40 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
17d50 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
17d60 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
17d70 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
17d80 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
17d90 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
17da0 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
17db0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
17dc0 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
17dd0 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
17de0 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
17df0 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
17e00 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
17e10 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
17e20 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
17e30 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
17e40 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
17e50 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
17e60 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
17e70 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
17e80 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
17e90 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
17ea0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
17eb0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
17ec0 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
17ed0 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
17ee0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
17ef0 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
17f00 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
17f10 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
17f20 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
17f30 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
17f40 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
17f50 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
17f60 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
17f70 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
17f80 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
17f90 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
17fa0 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
17fb0 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
17fc0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
17fd0 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
17fe0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
17ff0 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
18000 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
18010 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
18020 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
18030 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
18040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18050 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
18060 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
18070 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
18080 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
18090 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
180a0 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
180b0 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
180c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
180d0 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
180e0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
180f0 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
18100 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
18110 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
18120 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
18130 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
18140 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
18150 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
18160 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
18170 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
18180 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
18190 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
181a0 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
181b0 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
181c0 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
181d0 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
181e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
181f0 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
18200 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
18210 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
18220 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
18230 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
18240 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
18250 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
18260 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
18270 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
18280 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
18290 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
182a0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
182b0 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Pg==0 || pPager-
182c0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50  >tempFile );.  P
182d0 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
182e0 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
182f0 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
18300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
18310 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
18320 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
18330 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
18340 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
18350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
18360 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
18370 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
18380 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
18390 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
183a0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
183b0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
183c0 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
183d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
183e0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
183f0 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
18400 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
18410 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
18420 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
18430 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
18440 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
18450 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
18460 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
18470 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
18480 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
18490 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
184a0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
184b0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
184c0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
184d0 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
184e0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
184f0 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
18500 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
18510 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
18520 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
18530 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
18540 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
18550 68 65 20 64 61 74 61 20 72 65 61 64 20 66 72 6f  he data read fro
18560 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  m the journal ba
18570 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
18580 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
18590 2a 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  * This is usuall
185a0 79 20 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20  y safe even for 
185b0 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
185c0 61 62 61 73 65 20 2d 20 61 73 20 74 68 65 20 64  abase - as the d
185d0 61 74 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  ata.    ** was e
185e0 6e 63 72 79 70 74 65 64 20 62 65 66 6f 72 65 20  ncrypted before 
185f0 69 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  it was written t
18600 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
18610 6c 65 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  le. The exceptio
18620 6e 0a 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74  n.    ** is if t
18630 68 65 20 64 61 74 61 20 77 61 73 20 6a 75 73 74  he data was just
18640 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e   read from an in
18650 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
18660 6e 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20  nal. In that.   
18670 20 2a 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74   ** case it must
18680 20 62 65 20 65 6e 63 72 79 70 74 65 64 20 68 65   be encrypted he
18690 72 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  re before it is 
186a0 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
186b0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
186c0 66 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66  file.  */.#ifdef
186d0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
186e0 43 0a 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45  C.    if( !jrnlE
186f0 6e 63 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  nc ){.      CODE
18700 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
18710 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
18720 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
18730 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72   aData);.      r
18740 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
18750 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
18760 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67  u8 *)aData, pPag
18770 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
18780 73 74 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  st);.      CODEC
18790 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  1(pPager, aData,
187a0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c   pgno, 3, rc=SQL
187b0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
187c0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
187d0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
187e0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
187f0 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
18800 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
18810 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20  ize, ofst);..   
18820 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
18830 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
18840 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
18850 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
18860 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18870 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
18880 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18890 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
188a0 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20  if( jrnlEnc ){. 
188b0 20 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50         CODEC1(pP
188c0 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
188d0 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
188e0 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20  NOMEM_BKPT);.   
188f0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
18900 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
18910 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
18920 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
18930 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
18940 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
18950 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
18960 4d 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b  MEM_BKPT,aData);
18970 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
18980 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dif.      sqlite
18990 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
189a0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
189b0 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
189c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
189d0 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
189e0 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
189f0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
18a00 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
18a10 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
18a20 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
18a30 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
18a40 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
18a50 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
18a60 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
18a70 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
18a80 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
18a90 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
18aa0 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
18ab0 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
18ac0 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
18ad0 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
18ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
18af0 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
18b00 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
18b10 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
18b20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
18b30 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
18b40 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
18b50 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
18b60 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
18b70 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
18b80 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
18b90 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
18ba0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
18bb0 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
18bc0 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
18bd0 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
18be0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
18bf0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
18c00 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
18c10 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
18c20 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
18c30 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
18c40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
18c50 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
18c60 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
18c70 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
18c80 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
18c90 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
18ca0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
18cb0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
18cc0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
18cd0 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
18ce0 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
18cf0 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
18d00 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
18d10 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
18d20 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
18d30 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
18d40 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
18d50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
18d60 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
18d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
18d80 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
18d90 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
18da0 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20  LBACK)==0 );.   
18db0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
18dc0 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
18dd0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72  _ROLLBACK;.    r
18de0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18df0 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  Get(pPager, pgno
18e00 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
18e10 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
18e20 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
18e30 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18e40 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )!=0 );.    pPag
18e50 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18e60 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  = ~SPILLFLAG_ROL
18e70 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72  LBACK;.    if( r
18e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
18e90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71  eturn rc;.    sq
18ea0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
18eb0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
18ec0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
18ed0 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
18ee0 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
18ef0 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
18f00 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
18f10 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
18f20 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
18f30 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
18f40 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
18f50 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
18f60 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
18f70 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
18f80 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
18f90 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
18fa0 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
18fb0 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
18fc0 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
18fd0 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
18fe0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
18ff0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
19000 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
19010 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
19020 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
19030 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
19040 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
19050 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
19060 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
19070 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
19080 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75  Pg);.    /* It u
19090 73 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 73  sed to be that s
190a0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
190b0 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20 63  Clean(pPg) was c
190c0 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74  alled here.  But
190d0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c  .    ** that cal
190e0 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20  l was dangerous 
190f0 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63  and had no detec
19100 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69  table benefit si
19110 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a 20 20  nce the cache.  
19120 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79    ** is normally
19130 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69   cleaned by sqli
19140 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
19150 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  l() after rollba
19160 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a  ck and so.    **
19170 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
19180 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  d. */.    pager_
19190 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
191a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
191b0 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
191c0 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
191d0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
191e0 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
191f0 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
19200 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
19210 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
19220 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
19230 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
19240 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
19250 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
19260 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
19270 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
19280 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
19290 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
192a0 6f 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53  om disk */.#if S
192b0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
192c0 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20      if( jrnlEnc 
192d0 29 7b 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  ){ CODEC1(pPager
192e0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
192f0 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
19300 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a  _NOMEM_BKPT); }.
19310 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
19320 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
19330 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
19340 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19350 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
19360 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
19370 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
19380 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
19390 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
193a0 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
193b0 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
193c0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
193d0 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
193e0 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
193f0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
19400 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
19410 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
19420 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
19430 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
19440 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
19450 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
19460 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
19470 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
19480 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
19490 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
194a0 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
194b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
194c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
194d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
194e0 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
194f0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
19500 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
19510 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
19520 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
19530 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
19540 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
19550 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
19560 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
19570 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
19580 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
19590 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
195a0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
195b0 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
195c0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
195d0 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
195e0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
195f0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
19600 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
19610 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
19620 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
19630 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
19640 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
19650 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
19660 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
19670 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19680 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
19690 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
196a0 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
196b0 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
196c0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
196d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
196e0 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
196f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
19700 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
19710 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
19720 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
19730 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
19740 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
19750 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
19760 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
19770 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
19780 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
19790 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
197a0 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
197b0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
197c0 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
197d0 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
197e0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
197f0 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
19800 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
19810 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
19820 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
19830 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
19840 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
19850 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
19860 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
19870 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
19880 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
19890 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
198a0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
198b0 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
198c0 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
198d0 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
198e0 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
198f0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
19900 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
19910 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
19920 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
19930 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
19940 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
19950 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
19960 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
19970 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
19980 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
19990 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
199a0 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
199b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
199c0 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
199d0 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
199e0 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
199f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
19a00 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
19a10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
19a20 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
19a30 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
19a40 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
19a50 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
19a60 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
19a70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
19a80 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
19a90 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
19aa0 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
19ab0 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
19ac0 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
19ad0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
19ae0 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
19af0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
19b00 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
19b10 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
19b20 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
19b30 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
19b40 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
19b50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
19b60 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
19b70 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
19b80 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
19b90 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
19ba0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
19bb0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
19bc0 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
19bd0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
19be0 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
19bf0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
19c00 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
19c10 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
19c20 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
19c30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19c40 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
19c50 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
19c60 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
19c70 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19c80 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
19c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
19ca0 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72  nter to one jour
19cb0 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69  nal within MJ fi
19cc0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  le */.  char *zM
19cd0 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
19ce0 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
19cf0 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66  ld MJ filename f
19d00 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  rom a journal fi
19d10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  le */.  int nMas
19d20 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
19d30 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73    /* Amount of s
19d40 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74  pace allocated t
19d50 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a  o zMasterPtr[] *
19d60 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
19d70 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
19d80 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
19d90 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
19da0 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
19db0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
19dc0 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
19dd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
19de0 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
19df0 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
19e00 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
19e10 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
19e20 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
19e30 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
19e40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
19e50 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
19e60 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
19e70 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
19e80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
19e90 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
19ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
19eb0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
19ec0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19ed0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
19ee0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
19ef0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19f00 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
19f10 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
19f20 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
19f30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19f40 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
19f50 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
19f60 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
19f70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19f80 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
19f90 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
19fa0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
19fb0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
19fc0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
19fd0 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
19fe0 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
19ff0 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
1a000 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
1a010 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
1a020 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
1a030 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
1a040 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
1a050 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
1a060 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
1a070 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1a080 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
1a090 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
1a0a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a0b0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1a0c0 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
1a0d0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
1a0e0 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
1a0f0 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
1a100 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  e3Malloc(nMaster
1a110 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
1a120 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28  rPtr + 1);.  if(
1a130 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
1a140 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a150 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1a160 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a170 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
1a180 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
1a190 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
1a1a0 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
1a1b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1a1c0 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
1a1d0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
1a1e0 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
1a1f0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
1a200 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a210 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a220 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
1a230 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
1a240 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
1a250 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
1a260 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
1a270 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
1a280 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
1a290 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
1a2a0 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
1a2b0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1a2c0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
1a2d0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1a2e0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
1a2f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a310 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
1a320 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
1a330 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
1a340 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
1a350 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
1a360 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
1a370 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
1a380 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
1a390 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
1a3a0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
1a3b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1a3c0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
1a3d0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1a3e0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
1a3f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a400 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1a410 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
1a420 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
1a430 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
1a440 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1a450 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
1a460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1a470 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
1a480 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
1a490 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
1a4a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1a4c0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a4d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
1a4e0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1a4f0 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
1a500 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
1a510 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
1a520 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
1a530 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
1a540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a550 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1a560 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a570 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
1a580 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
1a590 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
1a5a0 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
1a5b0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
1a5c0 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
1a5d0 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
1a5e0 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
1a5f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a600 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1a610 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a620 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1a630 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
1a640 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
1a650 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
1a660 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
1a670 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
1a680 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
1a690 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
1a6a0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
1a6b0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
1a6c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1a6d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
1a6e0 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
1a6f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
1a700 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
1a710 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
1a720 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
1a730 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a740 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
1a750 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1a760 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a770 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
1a780 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
1a790 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1a7a0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
1a7b0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1a7c0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
1a7d0 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
1a7e0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
1a7f0 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
1a800 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
1a810 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
1a820 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1a830 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
1a840 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
1a850 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1a860 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
1a870 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
1a880 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
1a890 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
1a8a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a8b0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
1a8c0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
1a8d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1a8e0 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
1a8f0 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
1a900 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1a910 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
1a920 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1a930 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
1a940 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
1a950 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
1a960 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
1a970 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
1a980 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
1a990 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62  * Or, it might b
1a9a0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
1a9b0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1a9c0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1a9d0 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
1a9e0 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
1a9f0 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
1aa00 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
1aa10 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
1aa20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
1aa30 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
1aa40 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
1aa50 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
1aa60 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
1aa70 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
1aa80 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
1aa90 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
1aaa0 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
1aab0 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
1aac0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
1aad0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1aae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1aaf0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1ab00 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
1ab10 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
1ab20 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
1ab30 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
1ab40 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
1ab50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ab60 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
1ab70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1ab80 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
1ab90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1aba0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1abb0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1abc0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
1abd0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1abe0 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te!=PAGER_READER
1abf0 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f   );.  .  if( isO
1ac00 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1ac10 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1ac20 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1ac30 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1ac40 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1ac50 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a  GER_OPEN) .  ){.
1ac60 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
1ac70 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
1ac80 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70    int szPage = p
1ac90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1aca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1acb0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
1acc0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
1acd0 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
1ace0 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
1acf0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
1ad00 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
1ad10 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1ad20 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
1ad30 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
1ad40 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67   newSize = szPag
1ad50 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
1ad60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ad70 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
1ad80 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
1ad90 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
1ada0 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
1adb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1adc0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
1add0 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
1ade0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
1adf0 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a   if( (currentSiz
1ae00 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69  e+szPage)<=newSi
1ae10 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ze ){.        ch
1ae20 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65  ar *pTmp = pPage
1ae30 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1ae40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d        memset(pTm
1ae50 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20  p, 0, szPage);. 
1ae60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ae70 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1ae80 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65  ) == currentSize
1ae90 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1aea0 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
1aeb0 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e  zPage) >  curren
1aec0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
1aed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1aee0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1aef0 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e   pTmp, szPage, n
1af00 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a  ewSize-szPage);.
1af10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1af20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1af30 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1af40 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1af50 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
1af60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1af70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1af80 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65  eturn a sanitize
1af90 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
1afa0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20   sector-size of 
1afb0 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54  OS file pFile. T
1afc0 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
1afd0 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ue is guaranteed
1afe0 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20   to lie between 
1aff0 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f  32 and MAX_SECTO
1b000 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73  R_SIZE..*/.int s
1b010 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1b020 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1b030 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  File){.  int iRe
1b040 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  t = sqlite3OsSec
1b050 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a  torSize(pFile);.
1b060 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b    if( iRet<32 ){
1b070 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b  .    iRet = 512;
1b080 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65  .  }else if( iRe
1b090 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  t>MAX_SECTOR_SIZ
1b0a0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
1b0b0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b0c0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65  >=512 );.    iRe
1b0d0 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  t = MAX_SECTOR_S
1b0e0 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
1b0f0 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iRet;.}../*.**
1b100 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
1b110 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
1b120 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1b130 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
1b140 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
1b150 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1b160 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1b170 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
1b180 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
1b190 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
1b1a0 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1b1b0 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  be used .** to d
1b1c0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1b1d0 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
1b1e0 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
1b1f0 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
1b200 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1b210 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
1b220 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
1b230 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
1b240 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
1b250 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b260 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
1b270 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
1b280 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
1b290 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
1b2a0 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
1b2b0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
1b2c0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
1b2d0 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
1b2e0 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
1b2f0 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
1b300 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
1b310 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
1b320 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
1b330 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1b340 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
1b350 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
1b360 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20  TOR_SIZE..**.** 
1b370 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  If the file has 
1b380 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
1b390 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1b3a0 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74  RITE property, t
1b3b0 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65  hen set.** the e
1b3c0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b3d0 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  size to its mini
1b3e0 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e  mum value (512).
1b3f0 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
1b400 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74  .** pPager->sect
1b410 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66  orSize is to def
1b420 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72  ine the "blast r
1b430 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20  adius" of bytes 
1b440 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1b450 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20  ange if a crash 
1b460 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
1b470 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ting to a single
1b480 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74   byte in.** that
1b490 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74   range.  But wit
1b4a0 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  h POWERSAFE_OVER
1b4b0 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74  WRITE, the blast
1b4c0 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a   radius is zero.
1b4d0 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74  ** (that is what
1b4e0 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1b4f0 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20  RITE means), so 
1b500 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  we minimize the 
1b510 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20  sector.** size. 
1b520 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
1b530 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20  ompatibility of 
1b540 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1b550 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1b560 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72  ,.** we cannot r
1b570 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1b580 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1b590 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74  below 512..*/.st
1b5a0 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
1b5b0 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
1b5c0 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
1b5d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1b5e0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1b5f0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
1b600 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
1b610 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  ile.   || (sqlit
1b620 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1b630 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1b640 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20  ->fd) & .       
1b650 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1b660 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1b670 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b  ERWRITE)!=0.  ){
1b680 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
1b690 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
1b6a0 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
1b6b0 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
1b6c0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
1b6d0 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
1b6e0 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
1b6f0 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
1b700 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1b710 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
1b720 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70  gfault. */.    p
1b730 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1b740 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  e = 512;.  }else
1b750 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
1b760 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
1b770 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  e3SectorSize(pPa
1b780 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a  ger->fd);.  }.}.
1b790 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1b7a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1b7b0 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
1b7c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1b7d0 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
1b7e0 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
1b7f0 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
1b800 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
1b810 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1b820 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
1b830 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
1b840 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
1b850 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
1b860 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
1b870 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
1b880 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1b890 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b8a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
1b8b0 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
1b8c0 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
1b8d0 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
1b8e0 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1b8f0 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
1b900 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1b910 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
1b920 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
1b930 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
1b940 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
1b950 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1b960 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
1b970 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
1b980 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
1b990 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
1b9a0 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
1b9b0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b9c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b9d0 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
1b9e0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
1b9f0 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
1ba00 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
1ba10 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
1ba20 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1ba30 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
1ba40 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
1ba50 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
1ba60 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1ba70 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
1ba80 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1ba90 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1baa0 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73  ch is the page s
1bab0 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65  ize..**  (7)  ze
1bac0 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74  ro padding out t
1bad0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
1bae0 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20  r size..**  (8) 
1baf0 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
1bb00 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
1bb10 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
1bb20 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1bb30 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
1bb40 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
1bb50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1bb60 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
1bb70 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1bb80 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
1bb90 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
1bba0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1bbb0 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
1bbc0 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20  e first 7 items 
1bbd0 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
1bbe0 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
1bbf0 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
1bc00 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74  ce of the 8th it
1bc10 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
1bc20 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
1bc30 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
1bc40 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
1bc50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
1bc60 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
1bc70 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
1bc80 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
1bc90 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
1bca0 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
1bcb0 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
1bcc0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1bcd0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
1bce0 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
1bcf0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
1bd00 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
1bd10 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
1bd20 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
1bd30 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
1bd40 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
1bd50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1bd60 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
1bd70 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
1bd80 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
1bd90 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
1bda0 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
1bdb0 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
1bdc0 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
1bdd0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
1bde0 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
1bdf0 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
1be00 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
1be10 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
1be20 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
1be30 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1be40 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1be50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
1be60 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1be70 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
1be80 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
1be90 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
1bea0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1beb0 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
1bec0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
1bed0 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
1bee0 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
1bef0 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
1bf00 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
1bf10 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
1bf20 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
1bf30 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
1bf40 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
1bf50 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
1bf60 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
1bf70 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
1bf80 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
1bf90 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
1bfa0 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
1bfb0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
1bfc0 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
1bfd0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
1bfe0 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
1bff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1c000 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
1c010 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
1c020 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
1c030 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
1c040 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
1c050 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1c060 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
1c070 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
1c080 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
1c090 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1c0a0 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
1c0b0 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
1c0c0 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
1c0d0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
1c0e0 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
1c0f0 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
1c100 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
1c110 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
1c120 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
1c130 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1c140 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
1c150 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
1c160 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
1c170 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
1c180 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
1c190 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
1c1a0 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
1c1b0 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
1c1c0 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
1c1d0 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
1c1e0 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
1c1f0 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
1c200 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
1c210 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
1c220 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1c230 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
1c240 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
1c250 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
1c260 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
1c270 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
1c280 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
1c290 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
1c2a0 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
1c2b0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
1c2c0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
1c2d0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1c2e0 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
1c2f0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1c300 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1c310 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c330 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
1c340 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
1c350 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
1c360 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c370 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1c380 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
1c390 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
1c3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c3b0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1c3c0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1c3d0 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
1c3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1c3f0 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
1c400 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
1c410 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c430 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
1c440 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
1c450 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
1c460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1c470 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1c480 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1c490 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
1c4a0 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
1c4b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
1c4c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1c4d0 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
1c4e0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
1c4f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1c500 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
1c510 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
1c520 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
1c530 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20   nPlayback = 0; 
1c540 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1c550 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72  umber of pages r
1c560 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75  estored from jou
1c570 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  rnal */..  /* Fi
1c580 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1c590 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1c5a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1c5b0 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1c5c0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1c5d0 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1c5e0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1c5f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1c600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1c610 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1c620 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1c630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c640 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1c650 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1c660 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1c670 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1c680 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1c690 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1c6a0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1c6b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1c6c0 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1c6d0 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1c6e0 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1c6f0 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1c700 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1c710 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1c720 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1c730 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1c740 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1c750 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1c760 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1c770 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1c780 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1c790 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1c7a0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1c7b0 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1c7c0 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1c7d0 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1c7e0 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1c7f0 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1c800 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c810 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1c820 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68  x.c,.  ** mxPath
1c830 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1c840 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1c850 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1c860 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1c870 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1c880 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1c890 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1c8a0 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1c8b0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1c8c0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1c8d0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1c8e0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1c8f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c900 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1c910 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1c920 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1c930 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1c940 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1c950 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1c960 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1c970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c980 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1c990 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c9a0 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1c9b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1c9c0 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1c9d0 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1c9e0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1c9f0 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1ca00 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1ca10 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1ca20 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1ca30 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1ca40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1ca50 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1ca60 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1ca70 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1ca80 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1ca90 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1caa0 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1cab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1cac0 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1cad0 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1cae0 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1caf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1cb00 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1cb10 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1cb20 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1cb30 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1cb40 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1cb50 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1cb60 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1cb70 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1cb80 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1cb90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1cba0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1cbb0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1cbc0 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1cbd0 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1cbe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cbf0 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1cc00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1cc10 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1cc20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cc30 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1cc40 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cc50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1cc60 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1cc70 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1cc80 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1cc90 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1cca0 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1ccb0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1ccc0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1ccd0 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1cce0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1ccf0 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1cd00 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1cd10 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1cd20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1cd30 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1cd40 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1cd50 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1cd60 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1cd70 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1cd80 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1cd90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1cda0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1cdb0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1cdc0 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1cdd0 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1cde0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1cdf0 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1ce00 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1ce10 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1ce20 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1ce30 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1ce40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1ce50 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1ce60 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1ce70 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1ce80 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1ce90 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1cea0 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1ceb0 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1cec0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1ced0 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1cee0 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1cef0 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1cf00 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1cf10 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1cf20 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1cf30 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1cf40 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1cf50 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1cf60 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1cf70 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1cf80 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1cf90 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1cfa0 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1cfb0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1cfc0 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1cfd0 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1cfe0 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1cff0 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1d000 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1d010 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1d020 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1d030 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1d040 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1d050 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1d060 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1d070 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1d080 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1d090 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1d0a0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1d0b0 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1d0c0 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1d0d0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1d0e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1d0f0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1d100 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1d110 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1d120 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1d130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1d140 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1d150 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1d160 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1d170 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d180 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1d190 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1d1a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1d1b0 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1d1c0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1d1d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1d1e0 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1d1f0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1d200 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1d210 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1d220 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1d230 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1d240 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1d250 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1d260 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1d270 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1d280 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1d290 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1d2a0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d2b0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1d2c0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1d2d0 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1d2e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d2f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d300 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d310 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1d320 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d330 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1d340 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1d350 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1d360 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1d370 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1d380 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d390 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1d3a0 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1d3b0 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1d3c0 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1d3d0 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1d3e0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1d3f0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1d400 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1d410 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1d420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1d430 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1d440 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1d450 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1d460 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1d470 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d490 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1d4a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d4b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d4c0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1d4d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1d4e0 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1d4f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d500 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1d510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1d520 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1d530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d540 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1d550 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1d560 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1d570 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1d580 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1d590 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1d5a0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1d5b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1d5c0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1d5d0 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1d5e0 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1d5f0 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1d600 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1d610 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1d620 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1d630 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1d640 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1d650 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1d660 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1d670 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1d680 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1d690 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1d6a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d6b0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1d6c0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1d6d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d6f0 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1d700 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1d710 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1d720 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1d730 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1d740 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1d750 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1d760 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1d770 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1d780 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1d790 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1d7a0 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1d7b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1d7c0 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1d7d0 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1d7e0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1d7f0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1d800 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d810 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1d820 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1d830 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d840 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1d850 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1d860 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1d870 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
1d880 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
1d890 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1d8a0 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
1d8b0 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
1d8c0 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
1d8d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1d8e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
1d8f0 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
1d900 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1d910 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
1d920 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
1d930 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
1d940 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
1d950 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1d960 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
1d970 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66  dified..  */.#if
1d980 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d990 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
1d9a0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1d9b0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
1d9c0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
1d9d0 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1d9e0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1d9f0 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ,0);.  }.#endif.
1da00 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c  .  /* If this pl
1da10 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e  ayback is happen
1da20 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ing automaticall
1da30 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  y as a result of
1da40 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20   an IO or .  ** 
1da50 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61  malloc error tha
1da60 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  t occurred after
1da70 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1da80 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
1da90 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65  but .  ** before
1daa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1dab0 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
1dac0 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d  then the change-
1dad0 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f  counter .  ** mo
1dae0 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a  dification may j
1daf0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
1db00 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  verted. If this 
1db10 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75  happens in exclu
1db20 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c  sive .  ** mode,
1db30 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
1db40 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65   transactions pe
1db50 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63  rformed by the c
1db60 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e  onnection will n
1db70 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74  ot.  ** update t
1db80 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1db90 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d  r at all. This m
1dba0 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65  ay lead to cache
1dbb0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20   inconsistency. 
1dbc0 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72   ** problems for
1dbd0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1dbe0 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
1dbf0 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f  n the future. So
1dc00 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63  , just.  ** in c
1dc10 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
1dc20 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65  pened, clear the
1dc30 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
1dc40 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   flag now..  */.
1dc50 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1dc60 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1dc70 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1dc80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dc90 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
1dca0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1dcb0 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
1dcc0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1dcd0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1dce0 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1dcf0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1dd00 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +1);.    testcas
1dd10 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1dd20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1dd30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
1dd40 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1dd50 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1dd60 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1dd70 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1dd80 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1dd90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1dda0 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ync(pPager, 0);.
1ddb0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1ddc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1ddd0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1dde0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1ddf0 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1de00 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  0', 0);.    test
1de10 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1de20 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1de30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1de40 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1de50 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1de60 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1de70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1de80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1de90 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1dea0 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1deb0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1dec0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1ded0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1dee0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1def0 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1df00 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1df10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1df20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1df30 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26  }.  if( isHot &&
1df40 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20   nPlayback ){.  
1df50 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
1df60 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
1df70 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72  VER_ROLLBACK, "r
1df80 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65  ecovered %d page
1df90 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20  s from %s",.    
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61              nPla
1dfb0 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a  yback, pPager->z
1dfc0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20  Journal);.  }.. 
1dfd0 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1dfe0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1dff0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1e000 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1e010 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1e020 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1e030 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1e040 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1e050 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1e060 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1e070 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1e080 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1e090 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1e0a0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1e0b0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1e0c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1e0d0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1e0e0 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1e0f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e100 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
1e110 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1e120 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1e130 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1e140 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1e150 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1e160 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1e170 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1e180 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1e190 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1e1a0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1e1b0 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1e1c0 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1e1d0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1e1e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1e1f0 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1e200 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1e210 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1e220 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1e230 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1e240 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1e250 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1e260 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1e270 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c  Page(PgHdr *pPg,
1e280 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20   u32 iFrame){.  
1e290 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e2a0 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
1e2b0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
1e2c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1e2d0 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
1e2e0 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
1e2f0 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
1e300 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
1e310 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1e320 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1e330 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1e340 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
1e350 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e360 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ; /* Number of b
1e370 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
1e380 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e390 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1e3a0 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1e3b0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1e3c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1e3d0 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1e3e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1e3f0 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20  if( iFrame ){.  
1e400 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
1e410 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1e420 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
1e430 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
1e440 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72  sqlite3WalReadFr
1e450 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1e460 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20  , iFrame, pgsz, 
1e470 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pPg->pData);.  }
1e480 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
1e490 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1e4a0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1e4b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e4c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1e4d0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1e4e0 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1e4f0 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1e500 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e510 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1e520 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1e530 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e540 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1e550 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1e560 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1e570 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1e580 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1e590 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1e5a0 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1e5b0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1e5c0 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1e5d0 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1e5e0 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1e5f0 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1e600 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1e610 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1e620 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1e630 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1e640 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1e650 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1e660 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1e670 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1e680 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1e690 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1e6a0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1e6b0 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1e6c0 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1e6d0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1e6e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e6f0 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1e700 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1e710 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1e720 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1e730 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1e740 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1e750 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1e760 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1e770 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1e780 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1e790 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1e7a0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1e7b0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1e7c0 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e  te noise equalin
1e7d0 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1e7e0 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1e7f0 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1e800 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1e810 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1e820 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1e830 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1e840 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1e850 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1e860 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1e870 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1e880 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1e890 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1e8a0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1e8b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e8c0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1e8d0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1e8e0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1e8f0 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1e900 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1e910 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1e920 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1e930 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  KPT);..  PAGER_I
1e940 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1e950 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1e960 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1e970 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1e980 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1e990 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1e9a0 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1e9b0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1e9c0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1e9d0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1e9e0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1e9f0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1ea00 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1ea10 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1ea20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1ea30 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1ea40 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1ea50 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1ea60 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1ea70 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1ea80 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1ea90 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1eaa0 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1eab0 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1eac0 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1ead0 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1eae0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1eaf0 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1eb00 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1eb10 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1eb20 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1eb30 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1eb40 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1eb50 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1eb60 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1eb70 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1eb80 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1eb90 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1eba0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1ebb0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1ebc0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1ebd0 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1ebe0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1ebf0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1ec00 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1ec10 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1ec20 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1ec30 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1ec40 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1ec50 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1ec60 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1ec70 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1ec80 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1ec90 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1eca0 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1ecb0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1ecc0 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1ecd0 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1ece0 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1ecf0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1ed00 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1ed10 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1ed20 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1ed30 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1ed40 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1ed50 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1ed60 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1ed70 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1ed80 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1ed90 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1eda0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1edb0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1edc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1edd0 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1ede0 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1edf0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ee00 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1ee10 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1ee20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1ee30 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1ee40 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1ee50 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1ee60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1ee70 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1ee80 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1ee90 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1eea0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1eeb0 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1eec0 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1eed0 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1eee0 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1eef0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1ef00 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1ef10 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1ef20 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1ef30 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1ef40 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1ef50 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1ef60 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1ef70 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1ef80 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1ef90 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1efa0 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1efb0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1efc0 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1efd0 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1efe0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1eff0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1f000 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1f010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f020 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1f030 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1f040 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1f050 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f060 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1f070 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1f080 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1f090 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1f0a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1f0b0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1f0c0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1f0d0 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1f0e0 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1f0f0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1f100 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1f110 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f120 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1f130 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f140 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
1f150 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1f160 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
1f170 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1f180 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d  Pg->pgno, &iFram
1f190 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1f1a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f1b0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
1f1c0 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
1f1d0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1f1e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f1f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f200 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1f210 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
1f220 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f230 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
1f240 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
1f250 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69    /* Normally, i
1f260 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1f270 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1f280 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65  any backup proce
1f290 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70  sses are.  ** up
1f2a0 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73  dated as data is
1f2b0 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
1f2c0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1f2d0 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65  nal and into the
1f2e0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
1f2f0 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65  This is not gene
1f300 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77  rally possible w
1f310 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61  ith a WAL databa
1f320 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c  se, as.  ** roll
1f330 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69  back involves si
1f340 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20  mply truncating 
1f350 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68  the log file. Th
1f360 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a  erefore, if one.
1f370 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61    ** or more fra
1f380 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
1f390 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1f3a0 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68   the log (and th
1f3b0 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c  erefore .  ** al
1f3c0 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  so copied into t
1f3d0 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61  he backup databa
1f3e0 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20  ses) as part of 
1f3f0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1f400 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75  ,.  ** the backu
1f410 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61  ps must be resta
1f420 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rted..  */.  sql
1f430 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
1f440 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
1f450 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  p);..  return rc
1f460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f470 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f480 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ed to rollback a
1f490 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1f4a0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a  a WAL database..
1f4b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f4c0 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50  gerRollbackWal(P
1f4d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f4e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1f510 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1f520 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f530 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f540 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72  dirty pages to r
1f550 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46  evert */..  /* F
1f560 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  or all pages in 
1f570 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61  the cache that a
1f580 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  re currently dir
1f590 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61  ty or have alrea
1f5a0 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69  dy.  ** been wri
1f5b0 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f  tten (but not co
1f5c0 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20  mmitted) to the 
1f5d0 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65  log file, do one
1f5e0 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f   of the .  ** fo
1f5f0 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20  llowing:.  **.  
1f600 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74  **   + Discard t
1f610 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28  he cached page (
1f620 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c  if refcount==0),
1f630 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c   or.  **   + Rel
1f640 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
1f650 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f660 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e  se (if refcount>
1f670 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  0)..  */.  pPage
1f680 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1f690 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1f6a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f6b0 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  lUndo(pPager->pW
1f6c0 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  al, pagerUndoCal
1f6d0 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70  lback, (void *)p
1f6e0 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20  Pager);.  pList 
1f6f0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f700 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f710 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 6e  >pPCache);..#ifn
1f720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f730 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f 2a 20  CONCURRENT.  /* 
1f740 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f  If this is an CO
1f750 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63  NCURRENT transac
1f760 74 69 6f 6e 2c 20 74 68 65 6e 20 70 61 67 65 20  tion, then page 
1f770 31 20 6d 75 73 74 20 62 65 20 72 65 72 65 61 64  1 must be reread
1f780 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 74 68 65 20   from .  ** the 
1f790 64 62 20 66 69 6c 65 2c 20 65 76 65 6e 20 69 66  db file, even if
1f7a0 20 69 74 20 69 73 20 6e 6f 74 20 64 69 72 74 79   it is not dirty
1f7b0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
1f7c0 65 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  e the b-tree lay
1f7d0 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  er .  ** may hav
1f7e0 65 20 61 6c 72 65 61 64 79 20 7a 65 72 6f 65 64  e already zeroed
1f7f0 20 74 68 65 20 6e 46 72 65 65 20 61 6e 64 20 69   the nFree and i
1f800 54 72 75 6e 6b 20 68 65 61 64 65 72 20 66 69 65  Trunk header fie
1f810 6c 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  lds.  */.  if( r
1f820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f830 28 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69  (pList==0 || pLi
1f840 73 74 2d 3e 70 67 6e 6f 21 3d 31 29 20 26 26 20  st->pgno!=1) && 
1f850 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
1f860 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1f870 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1f880 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 31 29  void*)pPager, 1)
1f890 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1f8a0 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
1f8b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f8c0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78  .    PgHdr *pNex
1f8d0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1f8e0 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  y;.    rc = page
1f8f0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76  rUndoCallback((v
1f900 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c  oid *)pPager, pL
1f910 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1f920 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
1f930 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1f950 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1f960 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1f970 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1f980 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1f990 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1f9a0 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1f9b0 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1f9c0 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1f9d0 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1f9e0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1f9f0 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1fa00 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1fa10 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1fa20 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1fa30 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ged. .**.** The 
1fa40 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61  list of pages pa
1fa50 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
1fa60 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73  outine is always
1fa70 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20   sorted by page 
1fa80 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65  number..** Hence
1fa90 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65  , if page 1 appe
1faa0 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  ars anywhere on 
1fab0 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c  the list, it wil
1fac0 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70  l be the first p
1fad0 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  age..*/ .static 
1fae0 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
1faf0 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
1fb00 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1fb10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1fb20 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
1fb30 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
1fb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1fb50 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
1fb60 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
1fb70 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1fb80 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1fb90 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
1fba0 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
1fbb0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbd0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1fbe0 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
1fbf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1fc20 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ode */.  int nLi
1fc30 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1fc40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fc50 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
1fc60 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  List */.  PgHdr 
1fc70 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1fc80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1fc90 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1fca0 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ges */..  assert
1fcb0 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29  ( pPager->pWal )
1fcc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1fcd0 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  t );.#ifdef SQLI
1fce0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
1fcf0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
1fd00 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63  ge list is in ac
1fd10 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
1fd20 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1fd30 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20  p && p->pDirty; 
1fd40 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1fd50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e    assert( p->pgn
1fd60 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70  o < p->pDirty->p
1fd70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  gno );.  }.#endi
1fd80 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  f..  assert( pLi
1fd90 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c  st->pDirty==0 ||
1fda0 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69   isCommit );.  i
1fdb0 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1fdc0 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1fdd0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1fde0 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1fdf0 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1fe00 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1fe10 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1fe20 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1fe30 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1fe40 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1fe50 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1fe60 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1fe70 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
1fe80 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
1fe90 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
1fea0 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
1feb0 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
1fec0 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20  gHdr **ppNext = 
1fed0 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73  &pList;.    nLis
1fee0 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  t = 0;.    for(p
1fef0 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74  =pList; (*ppNext
1ff00 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70   = p)!=0; p=p->p
1ff10 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66  Dirty){.      if
1ff20 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e  ( p->pgno<=nTrun
1ff30 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  cate ){.        
1ff40 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69  ppNext = &p->pDi
1ff50 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69  rty;.        nLi
1ff60 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st++;.      }.  
1ff70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1ff80 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  pList );.  }else
1ff90 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b  {.    nList = 1;
1ffa0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61  .  }.  pPager->a
1ffb0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
1ffc0 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b  WRITE] += nList;
1ffd0 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70  ..  if( pList->p
1ffe0 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
1fff0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
20000 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20  er(pList);.  rc 
20010 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  = sqlite3WalFram
20020 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  es(pPager->pWal,
20030 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
20040 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c  pageSize, pList,
20050 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f   nTruncate, isCo
20060 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61  mmit, pPager->wa
20070 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a  lSyncFlags.  );.
20080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20090 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
200a0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f  Backup ){.    fo
200b0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
200c0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
200d0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
200e0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
200f0 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
20100 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
20110 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
20120 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
20130 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
20140 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
20150 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
20160 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
20170 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
20180 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
20190 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
201a0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
201b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
201c0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
201d0 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
201e0 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
201f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
20200 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
20210 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
20220 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
20230 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
20240 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
20250 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20260 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
20270 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
20280 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
20290 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
202a0 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
202b0 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
202c0 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
202d0 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
202e0 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
202f0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
20300 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
20310 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
20320 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
20330 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
20360 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
20370 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
20380 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20390 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
203a0 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
203b0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
203c0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
203d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
203e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
203f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
20400 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
20410 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
20420 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
20430 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
20440 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
20450 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
20460 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
20470 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
20480 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
20490 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
204a0 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
204b0 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
204c0 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
204d0 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
204e0 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
204f0 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
20500 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
20510 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
20520 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
20530 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
20540 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
20550 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
20560 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
20570 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
20580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
20590 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
205a0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
205b0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45  er);.    if( USE
205c0 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
205d0 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
205e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
205f0 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
20600 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
20610 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20620 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
20630 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61   part of the tra
20640 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47  nsition from PAG
20650 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41  ER_OPEN.** to PA
20660 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
20670 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
20680 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
20690 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
206a0 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e  n pages (assumin
206b0 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  g the page size 
206c0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
206d0 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69   in Pager.pageSi
206e0 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ze)..**.** If no
206f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
20700 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
20710 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a  rned and the siz
20720 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20730 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73  e.** in pages is
20740 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61   stored in *pnPa
20750 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ge. Otherwise, a
20760 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65  n error code (pe
20770 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  rhaps.** SQLITE_
20780 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20  IOERR_FSTAT) is 
20790 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e  returned and *pn
207a0 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d  Page is left unm
207b0 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  odified..*/.stat
207c0 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65  ic int pagerPage
207d0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
207e0 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67  ger, Pgno *pnPag
207f0 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
20800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20810 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
20820 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e  o return via *pn
20830 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75  Page */..  /* Qu
20840 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d  ery the WAL sub-
20850 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64  system for the d
20860 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68  atabase size. Th
20870 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20  e WalDbsize().  
20880 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
20890 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20  rns zero if the 
208a0 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  WAL is not open 
208b0 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c  (i.e. Pager.pWal
208c0 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66  ==0), or.  ** if
208d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
208e0 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ze is not availa
208f0 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73  ble. The databas
20900 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20  e size is not.  
20910 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ** available fro
20920 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
20930 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20  stem if the log 
20940 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72  file is empty or
20950 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e  .  ** contains n
20960 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65  o valid committe
20970 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
20980 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
20990 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
209a0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
209b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
209c0 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
209d0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
209e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
209f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20a00 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
20a10 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  =0 );.  nPage = 
20a20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
20a30 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
20a40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d  .  /* If the num
20a50 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
20a60 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20a70 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
20a80 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20  om the.  ** WAL 
20a90 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65  sub-system, dete
20aa0 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20 63  rmine the page c
20ab0 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74  ounte based on t
20ac0 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20  he size of.  ** 
20ad0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20ae0 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65 20  e.  If the size 
20af0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20b00 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20  file is not an. 
20b10 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   ** integer mult
20b20 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65  iple of the page
20b30 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20  -size, round up 
20b40 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
20b50 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
20b60 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65 6e  && ALWAYS(isOpen
20b70 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
20b80 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
20bb0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
20bc0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
20bd0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
20be0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
20bf0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20c10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20c20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50  }.    nPage = (P
20c30 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e  gno)((n+pPager->
20c40 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50  pageSize-1) / pP
20c50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
20c60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
20c70 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
20c80 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
20c90 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
20ca0 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63   than the.  ** c
20cb0 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
20cc0 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
20cd0 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
20ce0 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
20cf0 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
20d00 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
20d10 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
20d20 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
20d30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
20d40 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
20d50 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67  e;.  }..  *pnPag
20d60 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
20d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20d80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20d90 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
20da0 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77  Check if the *-w
20db0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72  al file that cor
20dc0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
20dd0 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
20de0 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69  by pPager.** exi
20df0 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62  sts if the datab
20e00 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c  ase is not empy,
20e10 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20   or verify that 
20e20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64  the *-wal file d
20e30 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74  oes.** not exist
20e40 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74   (by deleting it
20e50 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
20e60 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e  e file is empty.
20e70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
20e80 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
20e90 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61  pty and the *-wa
20ea0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f  l file exists, o
20eb0 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  pen the pager.**
20ec0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49   in WAL mode.  I
20ed0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20ee0 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f  s empty or if no
20ef0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
20f00 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20  ts and.** if no 
20f10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61  error occurs, ma
20f20 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f  ke sure Pager.jo
20f30 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74  urnalMode is not
20f40 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52   set to.** PAGER
20f50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
20f60 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20f70 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65  QLITE_OK or an e
20f80 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
20f90 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
20fa0 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c   hold a SHARED l
20fb0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20fc0 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c  ase file to call
20fd0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
20fe0 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58  n. Because an EX
20ff0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
21000 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72  the db file is r
21010 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74  equired to delet
21020 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61  e .** a WAL on a
21030 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61   none-empty data
21040 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72  base, this ensur
21050 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  es there is no r
21060 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a  ace condition .*
21070 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41  * between the xA
21080 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e  ccess() below an
21090 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62  d an xDelete() b
210a0 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79  eing executed by
210b0 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20   some .** other 
210c0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
210d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
210e0 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
210f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21100 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21110 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
21120 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
21130 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
21140 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21150 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
21160 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  CK );..  if( !pP
21170 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
21180 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
211b0 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
211c0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
211d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
211e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
211f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21200 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   */..    rc = pa
21210 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
21220 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
21230 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
21240 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50  n rc;.    if( nP
21250 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
21260 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
21270 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
21280 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
21290 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
212a0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
212b0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72  DELETE_NOENT ) r
212c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
212d0 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
212e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
212f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
21300 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
21310 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
21320 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
21330 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
21340 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
21350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21370 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
21380 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
21390 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
213a0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
213b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
213c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
213d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
213e0 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
213f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21400 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
21410 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
21420 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
21430 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21440 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
21450 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21460 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
21470 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21480 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
21490 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
214a0 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
214b0 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
214c0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
214d0 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
214e0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
214f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
21500 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
21510 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
21520 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
21530 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
21540 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
21550 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
21560 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
21570 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
21580 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
21590 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
215a0 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
215b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
215c0 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
215d0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
215e0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
215f0 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
21600 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
21610 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
21620 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
21630 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
21640 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
21650 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
21660 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21670 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
21680 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
21690 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
216a0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
216b0 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
216c0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
216d0 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
216e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
216f0 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
21700 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
21710 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21720 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
21730 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
21740 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21750 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
21760 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
21770 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
21780 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
21790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
217a0 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
217b0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
217c0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
217d0 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
217e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
217f0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
21800 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
21810 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
21820 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
21830 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
21840 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
21850 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
21860 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
21870 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
21880 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
21890 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
218a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
218b0 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
218c0 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
218d0 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
218e0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
218f0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
21900 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
21910 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
21920 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
21930 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
21940 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
21950 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
21960 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
21970 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
21980 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21990 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
219a0 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
219b0 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
219c0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
219d0 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
219e0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
219f0 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
21a00 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
21a10 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
21a20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
21a30 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
21a40 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
21a50 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
21a60 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
21a70 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
21a80 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
21a90 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
21aa0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
21ab0 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
21ac0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
21ad0 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
21ae0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
21af0 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
21b00 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
21b10 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
21b20 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
21b30 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
21b40 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
21b50 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
21b60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21b70 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
21b80 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
21b90 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
21ba0 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
21bb0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21bd0 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
21be0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21bf0 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
21c00 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
21c10 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
21c20 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
21c30 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
21c40 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
21c50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
21c60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21c70 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
21c80 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
21c90 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
21ca0 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
21cb0 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
21cc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21cd0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
21ce0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
21cf0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
21d00 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
21d10 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
21d20 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
21d30 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
21d40 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
21d50 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
21d60 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21d70 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
21d80 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
21d90 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
21da0 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
21db0 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
21dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21dd0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
21de0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
21df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
21e00 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
21e10 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
21e20 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
21e30 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
21e40 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
21e50 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
21e60 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
21e70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
21e80 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
21e90 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
21ea0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
21eb0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
21ec0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
21ed0 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
21ee0 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
21ef0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
21f00 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
21f10 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
21f20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
21f30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21f40 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
21f50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
21f60 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
21f70 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
21f80 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
21f90 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
21fa0 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
21fb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
21fc0 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
21fd0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
21fe0 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
21ff0 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
22000 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22010 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
22020 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
22030 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
22040 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
22050 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
22060 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
22070 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
22080 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
22090 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
220a0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
220b0 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
220c0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
220d0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
220e0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
220f0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
22100 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
22110 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
22120 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
22130 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
22140 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
22150 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
22160 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
22170 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
22180 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
22190 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
221a0 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
221b0 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
221c0 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
221d0 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
221e0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
221f0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
22200 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
22210 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
22220 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
22230 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
22240 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
22250 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
22260 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
22270 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
22280 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
22290 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
222a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
222b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
222c0 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
222d0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
222e0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
222f0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
22300 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
22310 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
22320 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22330 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
22340 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
22350 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
22360 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
22370 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
22380 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
22390 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
223a0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
223b0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
223c0 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
223d0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
223e0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
223f0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
22400 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
22410 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
22420 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
22430 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
22440 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
22450 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
22460 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
22470 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
22480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22490 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
224a0 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
224b0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
224c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
224d0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
224e0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
224f0 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
22500 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
22510 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
22520 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
22530 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
22540 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
22550 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
22560 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
22570 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
22580 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
22590 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
225a0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
225b0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
225c0 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
225d0 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
225e0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
225f0 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
22600 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
22610 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
22620 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
22630 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
22640 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
22650 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
22660 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
22670 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
22680 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
22690 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
226a0 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
226b0 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
226c0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
226d0 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
226e0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
226f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
22700 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
22710 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
22720 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
22730 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
22740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
22750 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
22760 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
22770 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22780 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
22790 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
227a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
227b0 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
227c0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
227d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
227e0 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
227f0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
22800 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
22810 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
22820 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
22830 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
22840 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
22850 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
22860 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
22870 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
22880 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
22890 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
228a0 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
228b0 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
228c0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
228d0 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
228e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
228f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22900 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
22910 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
22920 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
22930 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
22940 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
22950 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
22960 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22970 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
22980 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
22990 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
229a0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
229b0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
229c0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
229d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
229e0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
229f0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
22a00 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
22a10 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
22a20 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
22a30 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22a40 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
22a50 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
22a60 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
22a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22a80 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
22a90 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
22aa0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
22ab0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
22ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22ad0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
22ae0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
22af0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
22b00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
22b10 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
22b20 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
22b30 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
22b40 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
22b50 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
22b60 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61   recycle clean a
22b70 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e  nd unused pages.
22b80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22b90 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
22ba0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22bb0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
22bc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22bd0 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
22be0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
22bf0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  e);.}../*.** Cha
22c00 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
22c10 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
22c20 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
22c30 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
22c40 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
22c50 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74  to spill pages t
22c60 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  o journal..*/.in
22c70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
22c80 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72  tSpillsize(Pager
22c90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
22ca0 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
22cb0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22cc0 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72  Spillsize(pPager
22cd0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
22ce0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  e);.}../*.** Inv
22cf0 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  oke SQLITE_FCNTL
22d00 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64  _MMAP_SIZE based
22d10 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
22d20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e  value of szMmap.
22d30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22d40 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
22d50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22d60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
22d70 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71  MMAP_SIZE>0.  sq
22d80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
22d90 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69   pPager->fd;.  i
22da0 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26  f( isOpen(fd) &&
22db0 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69   fd->pMethods->i
22dc0 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20  Version>=3 ){.  
22dd0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22de0 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61  sz;.    sz = pPa
22df0 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20  ger->szMmap;.   
22e00 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
22e10 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ch = (sz>0);.   
22e20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
22e30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
22e40 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
22e50 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
22e60 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
22e70 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
22e80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
22e90 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22ea0 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
22eb0 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
22ec0 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
22ed0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
22ee0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22ef0 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
22f00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
22f10 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
22f20 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
22f30 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
22f40 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
22f50 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
22f60 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
22f70 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
22f80 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
22f90 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
22fa0 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
22fb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22fc0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
22fd0 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
22fe0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
22ff0 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
23000 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
23010 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
23020 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
23030 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
23040 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
23050 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23060 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
23070 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
23080 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
23090 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
230a0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
230b0 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
230c0 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
230d0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
230e0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
230f0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
23100 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
23110 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73 3a  are four levels:
23120 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
23130 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
23140 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
23150 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
23160 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
23170 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
23180 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
23190 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
231a0 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
231b0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
231c0 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
231d0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
231e0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
231f0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
23200 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
23210 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
23220 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
23230 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
23240 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
23250 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
23260 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
23270 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
23280 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
23290 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
232a0 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
232b0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
232c0 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
232d0 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
232e0 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
232f0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
23300 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
23310 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
23320 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
23330 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
23340 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
23350 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
23360 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
23380 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
23390 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
233a0 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
233b0 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
233c0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
233d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
233e0 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
233f0 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
23400 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
23410 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
23420 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
23430 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
23440 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
23450 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
23460 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
23470 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
23490 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
234a0 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
234b0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
234c0 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
234d0 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
234e0 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
234f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
23500 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
23510 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20 20  *.**    EXTRA   
23520 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 46    This is like F
23530 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74 20  ULL except that 
23540 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74 68  is also syncs th
23550 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 20  e directory.**  
23560 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
23570 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
23580 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
23590 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61 63  fter the rollbac
235a0 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
235b0 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e 6c    journal is unl
235c0 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inked..**.** The
235d0 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
235e0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
235f0 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
23600 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
23610 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
23620 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
23630 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
23640 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
23650 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
23660 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
23670 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
23680 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
23690 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
236a0 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
236b0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
236c0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
236d0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
236e0 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
236f0 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
23700 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
23710 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
23720 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
23730 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
23740 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
23750 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
23760 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
23770 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
23780 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
23790 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
237a0 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
237b0 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
237c0 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
237d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
237e0 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69 73  ORMAL.  There is
237f0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
23800 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61  etween FULL.** a
23810 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41 4c  nd EXTRA for WAL
23820 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20   mode..**.** Do 
23830 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
23840 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
23850 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
23860 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
23870 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
23880 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
23890 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
238a0 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
238b0 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
238c0 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
238d0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
238e0 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
238f0 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
23900 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
23910 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
23920 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
23930 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
23940 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23950 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
23960 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
23970 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
23980 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
23990 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
239a0 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
239b0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
239c0 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
239d0 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
239e0 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
239f0 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
23a00 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
23a10 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
23a20 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
23a30 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
23a40 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
23a50 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
23a60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23a70 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
23a80 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23a90 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65  SetFlags(.  Page
23aa0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23ab0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
23ac0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
23ad0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  el for */.  unsi
23ae0 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
23af0 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61    /* Various fla
23b00 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  gs */.){.  unsig
23b10 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c  ned level = pgFl
23b20 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
23b30 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20  HRONOUS_MASK;.  
23b40 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
23b50 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
23b60 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
23b70 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
23b80 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
23b90 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
23ba0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
23bb0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
23bc0 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52   =  level==PAGER
23bd0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
23be0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65   ?1:0;.    pPage
23bf0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
23c00 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel>=PAGER_SYNCH
23c10 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30  RONOUS_FULL ?1:0
23c20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
23c30 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  traSync = level=
23c40 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
23c50 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20  US_EXTRA ?1:0;. 
23c60 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
23c70 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  >noSync ){.    p
23c80 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23c90 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
23ca0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
23cb0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
23cc0 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
23cd0 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
23ce0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23cf0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23d00 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67  C_FULL;.    pPag
23d10 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
23d20 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23d30 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  FULL;.  }else if
23d40 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
23d50 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43  R_CKPT_FULLFSYNC
23d60 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23d70 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
23d80 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
23d90 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
23da0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
23db0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
23dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
23dd0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
23de0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
23df0 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
23e00 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
23e10 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
23e20 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  L;.  }.  pPager-
23e30 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
23e40 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23e50 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  s;.  if( pPager-
23e60 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
23e70 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
23e80 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e  Flags |= WAL_SYN
23e90 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
23ea0 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67    }.  if( pgFlag
23eb0 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53  s & PAGER_CACHES
23ec0 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67  PILL ){.    pPag
23ed0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
23ee0 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  = ~SPILLFLAG_OFF
23ef0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23f00 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
23f10 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  l |= SPILLFLAG_O
23f20 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  FF;.  }.}.#endif
23f30 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
23f40 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
23f50 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
23f60 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
23f70 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
23f80 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
23f90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
23fa0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
23fb0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
23fc0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
23fd0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
23fe0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23ff0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
24000 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
24010 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
24020 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
24030 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
24040 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
24050 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
24060 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
24070 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
24080 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
24090 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
240a0 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
240b0 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
240c0 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
240d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
240e0 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
240f0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
24100 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
24110 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
24120 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
24130 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
24140 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
24150 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
24160 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
24170 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
24180 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24190 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
241a0 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
241b0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
241c0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
241d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
241e0 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
241f0 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
24200 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
24210 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
24220 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
24230 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
24240 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
24250 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
24260 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
24270 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
24280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
24290 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
242a0 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
242b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
242c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
242d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
242e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
242f0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
24300 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
24310 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
24320 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
24330 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
24340 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
24350 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
24360 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
24370 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
24380 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
24390 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
243a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
243b0 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
243c0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
243d0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
243e0 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
243f0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
24400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
24410 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
24420 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24430 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
24440 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
24450 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
24460 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
24470 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
24480 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
24490 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
244a0 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
244b0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
244c0 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
244d0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
244e0 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
244f0 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
24500 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
24510 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
24520 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
24530 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
24540 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
24550 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
24560 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
24570 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
24580 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
24590 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
245a0 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
245b0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
245c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
245d0 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
245e0 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
245f0 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
24600 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
24610 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
24620 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
24630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
24660 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
24670 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
24680 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
24690 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
246a0 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
246b0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
246c0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
246d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
246e0 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
246f0 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
24700 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
24710 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
24720 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
24730 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
24740 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
24750 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
24760 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
24770 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
24780 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
24790 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
247a0 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
247b0 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
247c0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
247d0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
247e0 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
247f0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
24820 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
24830 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
24840 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
24850 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
24860 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
24870 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
24880 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
24890 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
248a0 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
248b0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
248c0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
248d0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
248e0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
248f0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
24900 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
24910 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
24920 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24930 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
24940 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
24950 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24960 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
24970 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
24980 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
24990 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
249a0 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
249b0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
249c0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
249d0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
249e0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
249f0 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
24a00 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
24a10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
24a20 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
24a30 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
24a40 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
24a50 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
24a60 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
24a70 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24a80 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
24a90 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
24aa0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
24ab0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24ac0 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
24ad0 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
24ae0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
24af0 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
24b00 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
24b10 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
24b20 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
24b30 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
24b40 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
24b50 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
24b60 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
24b70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
24b80 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
24b90 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
24ba0 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
24bb0 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
24bc0 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
24bd0 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
24be0 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
24bf0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
24c00 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
24c10 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
24c20 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
24c30 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
24c40 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
24c50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24c60 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
24c70 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
24c80 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
24c90 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
24ca0 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
24cb0 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
24cc0 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
24cd0 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
24ce0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
24cf0 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
24d00 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
24d10 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24d20 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
24d30 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24d40 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
24d50 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
24d60 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
24d70 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
24d80 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
24d90 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
24da0 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
24db0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
24dc0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
24dd0 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
24de0 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
24df0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
24e00 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
24e10 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
24e20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
24e30 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
24e40 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
24e50 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
24e60 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
24e70 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
24e80 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
24e90 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
24ea0 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
24eb0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
24ec0 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
24ed0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
24ee0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
24ef0 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
24f00 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
24f10 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
24f20 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
24f30 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
24f40 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
24f50 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
24f60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
24f70 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
24f80 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
24f90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24fa0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
24fb0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
24fc0 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
24fd0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
24fe0 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
24ff0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
25000 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
25010 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
25020 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
25030 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
25040 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
25050 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
25060 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
25070 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
25080 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
25090 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
250a0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
250b0 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
250c0 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
250d0 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
250e0 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
250f0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
25100 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
25110 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
25120 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
25130 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
25140 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
25150 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
25160 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
25170 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
25180 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
25190 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
251a0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
251b0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
251c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
251d0 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
251e0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
251f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
25200 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
25210 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
25220 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
25230 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
25240 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
25250 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
25260 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
25270 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
25280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25290 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
252a0 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
252b0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
252c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
252d0 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
252e0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
252f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
25300 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
25310 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
25320 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
25330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25340 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
25350 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
25360 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
25370 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
25380 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
25390 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
253a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
253b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
253c0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
253d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
253e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
253f0 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
25400 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25410 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
25420 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
25440 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
25450 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
25460 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
25470 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
25480 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  w;.      pPager-
25490 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
254a0 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65  ((nByte+pageSize
254b0 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  -1)/pageSize);. 
254c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
254d0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
254e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
254f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
25500 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a  ee(pNew);.    }.
25510 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a    }..  *pPageSiz
25520 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
25530 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Size;.  if( rc==
25540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25550 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
25560 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61  ) nReserve = pPa
25570 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  ger->nReserve;. 
25580 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65     assert( nRese
25590 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
255a0 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70  ve<1000 );.    p
255b0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
255c0 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b  = (i16)nReserve;
255d0 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
255e0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
255f0 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
25600 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  it(pPager);.  }.
25610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25620 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
25630 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
25640 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
25650 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
25660 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
25670 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
25680 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
25690 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
256a0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
256b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
256c0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
256d0 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
256e0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
256f0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
25700 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
25710 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
25720 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
25730 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
25740 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
25750 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
25760 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
25770 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
25780 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
25790 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
257a0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
257b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
257c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
257d0 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
257e0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
257f0 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
25800 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
25810 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
25820 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
25830 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
25840 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
25850 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
25860 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
25870 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
25880 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
25890 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
258a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
258b0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
258c0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
258d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
258e0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
258f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25900 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
25910 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25920 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
25930 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
25940 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
25950 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
25960 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25970 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
25980 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20  OPEN );      /* 
25990 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f  Called only by O
259a0 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20  P_MaxPgcnt */.  
259b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
259c0 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e  mxPgno>=pPager->
259d0 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50  dbSize );  /* OP
259e0 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63  _MaxPgcnt enforc
259f0 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74  es this */.  ret
25a00 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
25a10 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
25a20 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
25a30 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
25a40 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
25a50 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
25a60 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
25a70 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
25a80 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
25a90 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
25aa0 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
25ab0 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
25ac0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
25ad0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
25ae0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
25af0 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
25b00 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
25b10 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
25b20 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
25b30 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
25b40 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
25b50 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
25b60 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
25b70 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
25b80 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
25b90 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
25ba0 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
25bb0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
25bc0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
25bd0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
25be0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25bf0 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
25c00 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
25c10 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
25c20 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
25c30 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25c40 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
25c50 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
25c60 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
25c70 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
25c80 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
25c90 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
25ca0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25cb0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
25cc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
25cd0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
25ce0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
25cf0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
25d00 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
25d10 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
25d20 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
25d30 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
25d40 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
25d50 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
25d60 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
25d70 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
25d80 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
25d90 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
25da0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
25db0 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
25dc0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
25dd0 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
25de0 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
25df0 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
25e00 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
25e10 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
25e20 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
25e30 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
25e40 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
25e50 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
25e60 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
25e70 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
25e80 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
25e90 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
25ea0 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
25eb0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
25ec0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
25ed0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
25ee0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
25ef0 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
25f00 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
25f10 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
25f20 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
25f30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
25f40 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
25f50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25f60 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
25f70 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
25f80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25f90 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
25fa0 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
25fb0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
25fc0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
25fd0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
25fe0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
25ff0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
26000 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74  y btree immediat
26010 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69  ely after creati
26020 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65  ng.  ** the Page
26030 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65  r object.  There
26040 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e   has not been an
26050 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
26060 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20  transition.  ** 
26070 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e  to WAL mode yet.
26080 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26090 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
260a0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69  ger) );..  if( i
260b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
260c0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
260d0 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
260e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
260f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26100 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
26110 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
26120 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26130 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
26140 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
26150 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26160 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
26170 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
26180 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
26190 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
261a0 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  when a read-tran
261b0 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
261c0 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e  on.** the pager.
261d0 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   It returns the 
261e0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
261f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
26200 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77  abase..**.** How
26210 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c  ever, if the fil
26220 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61  e is between 1 a
26230 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62  nd <page-size> b
26240 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
26250 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63  en .** this is c
26260 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61  onsidered a 1 pa
26270 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ge file..*/.void
26280 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
26290 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
262a0 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
262b0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
262c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
262d0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
262e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
262f0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
26300 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b  ITER_FINISHED );
26310 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e  .  *pnPage = (in
26320 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  t)pPager->dbSize
26330 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
26340 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
26350 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
26360 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
26370 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
26380 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
26390 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
263a0 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
263b0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
263c0 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
263d0 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
263e0 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
263f0 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
26400 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
26410 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
26420 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
26430 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
26440 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
26450 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
26460 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
26470 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
26480 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
26490 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
264a0 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
264b0 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
264c0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
264d0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
264e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
264f0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
26500 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
26510 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
26520 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
26530 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
26540 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
26550 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
26560 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
26570 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
26580 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
26590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
265a0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
265b0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
265c0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
265d0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
265e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
26600 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43   code */..  /* C
26610 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
26620 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
26630 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
26640 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
26650 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
26660 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  ld), or one of t
26670 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  he transitions t
26680 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
26690 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
266a0 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
266b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
266c0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
266d0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
266e0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
266f0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
26700 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
26710 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
26720 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
26730 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  Lock==NO_LOCK &&
26740 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
26750 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c  D_LOCK).       |
26760 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
26770 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
26780 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  && locktype==EXC
26790 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
267a0 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  ;..  do {.    rc
267b0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
267c0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
267d0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
267e0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
267f0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
26800 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
26810 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
26820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26830 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61  /*.** Function a
26840 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26850 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20  straint(pPager) 
26860 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20  checks that one 
26870 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
26880 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72  wing is true for
26890 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
268a0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
268b0 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a  e page-cache:.**
268c0 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67  .**   a) The pag
268d0 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
268e0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
268f0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
26900 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65  e .**      curre
26910 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  nt database imag
26920 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a  e, in pages, OR.
26930 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68  **.**   b) if th
26940 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  e page content w
26950 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74  ere written at t
26960 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75  his time, it wou
26970 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62  ld not.**      b
26980 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  e necessary to w
26990 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
269a0 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20   content out to 
269b0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
269c0 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65  **      (as dete
269d0 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69  rmined by functi
269e0 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  on subjRequiresP
269f0 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  age())..**.** If
26a00 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61   the condition a
26a10 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20  sserted by this 
26a20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f  function were no
26a30 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a  t true, and the.
26a40 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65  ** dirty page we
26a50 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  re to be discard
26a60 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
26a70 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53  e via the pagerS
26a80 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69  tress().** routi
26a90 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28  ne, pagerStress(
26aa0 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) would not writ
26ab0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
26ac0 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a  ge content to.**
26ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26ae0 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69  le. If a savepoi
26af0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
26b00 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ere rolled back 
26b10 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61  after.** this ha
26b20 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72  ppened, the corr
26b30 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75  ect behavior wou
26b40 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
26b50 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
26b60 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
26b70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
26b80 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
26b90 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
26ba0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
26bb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
26bc0 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
26bd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
26be0 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
26bf0 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
26c00 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
26c10 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
26c20 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
26c30 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
26c40 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
26c50 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
26c60 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
26c70 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
26c80 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
26c90 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
26ca0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
26cb0 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
26cc0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
26cd0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
26ce0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
26cf0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
26d00 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
26d10 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
26d20 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
26d30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
26d40 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
26d50 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
26d60 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
26d70 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
26d80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
26d90 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
26da0 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
26db0 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
26dc0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26dd0 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
26de0 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
26df0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26e00 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
26e10 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
26e20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
26e30 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
26e40 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
26e50 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
26e60 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
26e70 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
26e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
26e90 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
26ea0 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
26eb0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
26ec0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
26ed0 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
26ee0 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
26ef0 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
26f00 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
26f10 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
26f20 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
26f30 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
26f40 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
26f50 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
26f60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
26f70 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69  Once this functi
26f80 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  on has been call
26f90 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ed, the transact
26fa0 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20  ion must either 
26fb0 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  be.** rolled bac
26fc0 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20  k or committed. 
26fd0 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
26fe0 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
26ff0 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e  tion and.** then
27000 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e   continue writin
27010 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
27020 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
27030 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
27040 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
27050 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
27060 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27070 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
27080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27090 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
270a0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
270b0 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
270c0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
270d0 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  ..  /* At one po
270e0 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  int the code her
270f0 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54  e called assertT
27100 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
27110 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75  t() to.  ** ensu
27120 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  re that all page
27130 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65  s being truncate
27140 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f  d away by this o
27150 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20  peration are,.  
27160 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** if one or mor
27170 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
27180 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69   open, present i
27190 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
271a0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f  .  ** journal so
271b0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
271c0 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68  e restored if th
271d0 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72  e savepoint is r
271e0 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
271f0 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67   This is no long
27200 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  er necessary as 
27210 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27220 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63   now only.  ** c
27230 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
27240 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
27250 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
27260 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20  although the .  
27270 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ** Pager object 
27280 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f  may still have o
27290 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28  pen savepoints (
272a0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
272b0 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79  !=0), .  ** they
272c0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
272d0 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61  d back. So the a
272e0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
272f0 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20  straint() call. 
27300 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   ** is no longer
27310 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a   correct. */.}..
27320 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
27330 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
27340 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
27350 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
27360 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
27370 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
27380 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
27390 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
273a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
273b0 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
273c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
273d0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
273e0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
273f0 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
27400 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
27410 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
27420 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
27430 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
27440 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
27450 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
27460 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
27470 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
27480 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
27490 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
274a0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
274b0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
274c0 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
274d0 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
274e0 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
274f0 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
27500 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
27510 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
27520 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
27530 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
27540 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
27550 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
27560 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
27570 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
27580 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
27590 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
275a0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
275b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
275c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
275d0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
275e0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
275f0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
27600 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
27610 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
27620 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
27630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
27640 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
27650 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
27660 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
27670 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
27680 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53  urn rc;.}..#if S
27690 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
276a0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  IZE>0./*.** Obta
276b0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
276c0 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  o a memory mappe
276d0 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f  d page object fo
276e0 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  r page number pg
276f0 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20  no. .** The new 
27700 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20  object will use 
27710 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74  the pointer pDat
27720 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  a, obtained from
27730 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66   xFetch()..** If
27740 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
27750 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e   *ppPage to poin
27760 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
27770 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61  e reference.** a
27780 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
27790 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
277a0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
277b0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
277c0 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74  set.** *ppPage t
277d0 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61  o zero..**.** Pa
277e0 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62  ge references ob
277f0 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
27800 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
27810 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73  should be releas
27820 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ed.** by calling
27830 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27840 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
27850 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
27860 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67  reMapPage(.  Pag
27870 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27890 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
278a0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278c0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
278d0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
278e0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
278f0 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28        /* xFetch(
27900 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69  )'d data for thi
27910 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
27920 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20  r **ppPage      
27930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27940 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67  UT: Acquired pag
27950 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
27960 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
27990 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e  d page to return
279a0 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61   */.  .  if( pPa
279b0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
279c0 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
279d0 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
279e0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
279f0 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
27a00 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
27a10 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
27a20 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  rty = 0;.    ass
27a30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45 78  ert( pPager->nEx
27a40 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65  tra>=8 );.    me
27a50 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20  mset(p->pExtra, 
27a60 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 8);.  }else{.
27a70 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
27a80 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74  = (PgHdr *)sqlit
27a90 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
27aa0 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61  eof(PgHdr) + pPa
27ab0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
27ac0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
27ad0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
27ae0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
27af0 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
27b00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27b10 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
27b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27b30 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
27b40 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d  .    p->pExtra =
27b50 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a   (void *)&p[1];.
27b60 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50      p->flags = P
27b70 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70  GHDR_MMAP;.    p
27b80 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
27b90 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  p->pPager = pPag
27ba0 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  er;.  }..  asser
27bb0 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76  t( p->pExtra==(v
27bc0 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20  oid *)&p[1] );. 
27bd0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
27be0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
27bf0 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44  ( p->flags==PGHD
27c00 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65  R_MMAP );.  asse
27c10 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70  rt( p->pPager==p
27c20 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
27c30 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  t( p->nRef==1 );
27c40 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67  ..  p->pgno = pg
27c50 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d  no;.  p->pData =
27c60 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72   pData;.  pPager
27c70 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20  ->nMmapOut++;.. 
27c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27c90 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
27ca0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
27cb0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
27cc0 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
27cd0 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
27ce0 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
27cf0 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
27d00 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
27d10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
27d30 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
27d40 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
27d50 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
27d60 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
27d70 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
27d80 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
27d90 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
27da0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27db0 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
27dc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
27dd0 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
27de0 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  sq
27df0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
27e00 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
27e10 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
27e20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
27e30 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
27e40 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
27e50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
27e60 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
27e70 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
27e80 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
27e90 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
27ea0 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
27eb0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
27ec0 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
27ed0 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
27ee0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
27ef0 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
27f00 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
27f10 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
27f20 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
27f30 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
27f40 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
27f50 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
27f60 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
27f70 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
27f80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
27f90 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
27fa0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
27fb0 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
27fc0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
27fd0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
27fe0 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
27ff0 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
28000 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
28010 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
28020 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
28030 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
28040 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
28050 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
28060 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
28070 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
28080 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
28090 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
280a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
280b0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
280c0 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
280d0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
280e0 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
280f0 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
28100 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
28110 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
28120 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
28130 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
28140 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
28150 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
28160 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
28170 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
28180 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
28190 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
281a0 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
281b0 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  r, sqlite3 *db){
281c0 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
281d0 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
281e0 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74  Space;..  assert
281f0 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55 73 65  ( db || pagerUse
28200 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
28210 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
28220 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
28230 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61  Pager) );.  disa
28240 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
28250 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
28260 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
28270 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72  alloc();.  pager
28280 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67  FreeMapHdrs(pPag
28290 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  er);.  /* pPager
282a0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a  ->errCode = 0; *
282b0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  /.  pPager->excl
282c0 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23  usiveMode = 0;.#
282d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
282e0 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28  IT_WAL.  assert(
282f0 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70   db || pPager->p
28300 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Wal==0 );.  sqli
28310 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
28320 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50  er->pWal, db, pP
28330 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
28340 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
28350 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 28 64 62  eSize,.      (db
28360 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
28370 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e   SQLITE_NoCkptOn
28380 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70 54 6d  Close) ? 0 : pTm
28390 70 29 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 72  p).  );.  pPager
283a0 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64  ->pWal = 0;.#end
283b0 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  if.  pager_reset
283c0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
283d0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
283e0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
283f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28400 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e  /* If it is open
28410 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
28420 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  al file before c
28430 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64  alling UnlockAnd
28440 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a  Rollback..    **
28450 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
28460 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e  done, then an un
28470 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
28480 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
28490 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  al .    ** file 
284a0 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61  may be played ba
284b0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
284c0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
284d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
284e0 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68  .    ** while th
284f0 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
28500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
28510 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
28520 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  pt..    **.    *
28530 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
28540 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
28550 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  g to sync the jo
28560 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65  urnal, shift the
28570 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e   pager.    ** in
28580 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
28590 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  te. This causes 
285a0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
285b0 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  k to unlock the.
285c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
285d0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  and close the jo
285e0 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f  urnal file witho
285f0 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ut attempting to
28600 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20   roll it.    ** 
28610 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65  back or finalize
28620 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61   it. The next da
28630 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c  tabase user will
28640 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d   have to do hot-
28650 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72  journal.    ** r
28660 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ollback before a
28670 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
28680 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
28690 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  */.    if( isOpe
286a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
286b0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
286c0 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65  ror(pPager, page
286d0 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
286e0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
286f0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
28700 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
28710 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
28720 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
28730 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
28740 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
28750 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
28760 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
28770 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28780 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
28790 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
287a0 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
287b0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
287c0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  d);.  sqlite3OsC
287d0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
287e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
287f0 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c  ree(pTmp);.  sql
28800 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
28810 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
28820 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
28830 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
28840 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
28850 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
28860 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
28870 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
28880 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
28890 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
288a0 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
288b0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
288c0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
288d0 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
288e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
288f0 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
28900 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
28910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28920 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
28930 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
28940 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
28950 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
28960 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
28970 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
28980 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
28990 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
289a0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
289b0 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
289c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
289d0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
289e0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
289f0 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
28a00 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
28a10 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
28a20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
28a30 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
28a40 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
28a50 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
28a60 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
28a70 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
28a80 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
28a90 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
28aa0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
28ab0 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
28ac0 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
28ad0 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
28ae0 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
28af0 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
28b00 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
28b10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
28b20 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
28b30 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
28b40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
28b50 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
28b60 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
28b70 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
28b80 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
28b90 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
28ba0 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
28bb0 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
28bc0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
28bd0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
28be0 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
28bf0 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
28c00 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
28c10 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
28c20 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
28c30 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
28c40 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
28c50 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
28c60 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
28c70 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
28c80 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
28c90 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
28ca0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
28cb0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
28cc0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
28cd0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
28ce0 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
28cf0 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
28d00 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
28d10 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
28d20 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
28d30 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
28d40 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
28d50 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
28d60 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
28d70 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
28d80 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
28d90 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
28da0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
28db0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
28dc0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
28dd0 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
28de0 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
28df0 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
28e00 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
28e10 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
28e20 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
28e30 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
28e40 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
28e50 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
28e60 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
28e70 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
28e80 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
28e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
28ea0 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
28eb0 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
28ec0 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
28ed0 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
28ee0 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
28ef0 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
28f00 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
28f10 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
28f20 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
28f30 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
28f40 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
28f50 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
28f60 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
28f70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
28f80 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
28f90 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
28fa0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
28fb0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
28fc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
28fd0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
28fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
28ff0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
29000 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64  Pager, int newHd
29010 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29040 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
29050 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
29060 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
29070 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
29080 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
29090 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
290a0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
290b0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
290c0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
290d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
290e0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
290f0 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
29100 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
29110 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 2c 20 30  veLock(pPager, 0
29120 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
29130 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29140 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
29150 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
29160 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
29170 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
29180 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
29190 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
291a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
291b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
291c0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
291d0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
291e0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
291f0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
29200 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
29210 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
29220 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
29230 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
29240 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
29250 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
29260 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
29270 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
29280 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
29290 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
292a0 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
292b0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
292c0 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
292d0 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
292e0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
292f0 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
29300 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
29310 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
29320 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
29330 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
29340 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
29350 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
29360 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
29370 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
29380 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
29390 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
293a0 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
293b0 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
293c0 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
293d0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
293e0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
293f0 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
29400 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
29410 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
29420 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
29430 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
29440 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
29450 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
29460 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
29470 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
29480 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
29490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
294a0 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
294b0 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
294c0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
294d0 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
294e0 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
294f0 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
29500 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
29510 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
29520 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
29530 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
29540 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
29550 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
29560 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
29570 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
29580 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
29590 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
295a0 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
295b0 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
295c0 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
295d0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
295e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
295f0 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29600 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
29610 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
29620 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
29630 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
29640 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
29650 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
29660 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
29670 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
29680 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
29690 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
296a0 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
296b0 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
296c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
296d0 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
296e0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
296f0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
29700 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
29710 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
29720 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
29730 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
29740 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
29750 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
29760 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
29770 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
29780 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
29790 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
297a0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
297b0 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
297c0 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
297d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
297e0 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
297f0 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
29800 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
29810 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
29820 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29830 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
29840 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
29850 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
29860 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
29870 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
29880 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
29890 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
298a0 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
298b0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
298c0 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
298d0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
298e0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
298f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29900 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
29910 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
29920 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
29930 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
29940 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
29950 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
29960 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
29970 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
29980 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
29990 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
299a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
299b0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
299c0 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
299d0 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
299e0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
299f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
29a10 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
29a20 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
29a30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
29a50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
29a60 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
29a70 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
29a80 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
29a90 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
29aa0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
29ab0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
29ac0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
29ad0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
29ae0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
29af0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
29b00 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
29b10 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
29b20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
29b30 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
29b40 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
29b50 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
29b60 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
29b70 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
29b80 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
29b90 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
29ba0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
29bb0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
29bc0 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
29bd0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
29be0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
29bf0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
29c00 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
29c10 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
29c20 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
29c30 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
29c40 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
29c50 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
29c60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
29c70 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
29c80 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
29c90 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
29ca0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
29cb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
29cc0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
29cd0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
29ce0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
29cf0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
29d00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29d10 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
29d20 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29d30 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
29d40 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
29d50 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
29d60 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
29d70 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
29d80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
29d90 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
29da0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
29dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
29de0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
29df0 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
29e00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
29e10 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
29e20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
29e30 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
29e40 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
29e50 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
29e60 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
29e70 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
29e80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29e90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
29ea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29eb0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
29ec0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
29ed0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
29ee0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
29ef0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
29f00 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
29f10 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
29f20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
29f30 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
29f40 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
29f50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
29f60 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
29f70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
29f80 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
29f90 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
29fa0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
29fb0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
29fc0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
29fd0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
29fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a000 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
2a010 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2a020 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a030 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
2a040 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
2a050 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
2a060 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
2a070 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
2a080 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
2a090 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
2a0a0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
2a0b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a0c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a0d0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2a0e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
2a0f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2a100 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2a110 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
2a120 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
2a130 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
2a140 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
2a150 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
2a160 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
2a170 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
2a180 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
2a190 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
2a1a0 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
2a1b0 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
2a1c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
2a1d0 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
2a1e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2a1f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
2a200 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
2a210 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
2a220 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2a230 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2a240 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a250 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2a260 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
2a270 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
2a280 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
2a290 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
2a2a0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
2a2b0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
2a2c0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
2a2d0 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
2a2e0 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
2a2f0 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
2a300 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
2a310 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2a320 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
2a330 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
2a340 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
2a350 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
2a360 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2a370 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
2a380 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
2a390 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
2a3a0 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
2a3b0 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
2a3c0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
2a3d0 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
2a3e0 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
2a3f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a400 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
2a410 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
2a420 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2a430 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
2a440 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
2a450 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
2a460 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2a470 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
2a480 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2a490 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
2a4a0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2a4b0 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
2a4c0 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
2a4d0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
2a4e0 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
2a4f0 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
2a500 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
2a510 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
2a520 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
2a530 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
2a540 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
2a550 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
2a560 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
2a570 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
2a580 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
2a590 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
2a5a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2a5b0 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
2a5c0 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
2a5d0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
2a5e0 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
2a5f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2a600 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
2a610 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
2a620 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
2a630 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
2a640 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
2a650 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
2a660 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
2a670 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
2a680 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
2a690 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
2a6a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2a6b0 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
2a6c0 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
2a6d0 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
2a6e0 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
2a6f0 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
2a700 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
2a710 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
2a720 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
2a730 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
2a740 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
2a750 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
2a760 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2a770 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
2a780 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
2a790 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2a7a0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2a7b0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2a7c0 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
2a7d0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2a7e0 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
2a7f0 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
2a800 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
2a810 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
2a820 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2a830 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
2a840 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
2a850 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
2a860 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
2a870 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a890 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2a8a0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
2a8b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
2a8c0 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
2a8d0 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
2a8e0 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
2a8f0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
2a900 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2a910 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
2a920 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2a930 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  le || pPager->eS
2a940 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2a950 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
2a960 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
2a970 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
2a980 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2a990 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a9a0 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44  fd) || pList->pD
2a9b0 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
2a9c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
2a9d0 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
2a9e0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2a9f0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
2aa00 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
2aa10 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
2aa20 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
2aa30 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2aa40 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
2aa50 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
2aa60 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2aa70 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
2aa80 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
2aa90 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
2aaa0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
2aab0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2aac0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
2aad0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2aae0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2aaf0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2ab00 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2ab10 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
2ab20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
2ab30 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
2ab40 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
2ab50 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
2ab60 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
2ab70 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
2ab80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
2ab90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2aba0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2abb0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
2abc0 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70  LITE_OK .   && p
2abd0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2abe0 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
2abf0 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70  .   && (pList->p
2ac00 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e  Dirty || pList->
2ac10 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48  pgno>pPager->dbH
2ac20 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20  intSize).  ){.  
2ac30 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2ac40 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
2ac50 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
2ac60 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
2ac70 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
2ac80 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
2ac90 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
2aca0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
2acb0 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
2acc0 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
2acd0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
2ace0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2acf0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
2ad00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2ad10 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
2ad20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
2ad30 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
2ad40 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
2ad50 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
2ad60 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
2ad70 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
2ad80 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
2ad90 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
2ada0 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
2adb0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
2adc0 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
2add0 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
2ade0 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
2adf0 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
2ae00 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
2ae10 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
2ae20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
2ae30 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
2ae40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
2ae50 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
2ae60 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
2ae70 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
2ae80 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
2ae90 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
2aea0 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
2aeb0 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
2aec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
2aed0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
2aee0 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
2aef0 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
2af00 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
2af10 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
2af20 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
2af30 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
2af40 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
2af50 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
2af60 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
2af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2af90 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
2afa0 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
2afb0 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
2afc0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2afd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2afe0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
2aff0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
2b000 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
2b010 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
2b020 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
2b030 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
2b040 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
2b050 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
2b060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b070 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29  MEM_BKPT, pData)
2b080 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
2b090 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
2b0a0 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
2b0b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2b0c0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
2b0d0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
2b0e0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
2b0f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
2b100 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
2b110 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
2b120 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
2b130 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
2b140 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
2b150 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
2b160 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
2b170 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
2b180 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
2b190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b1a0 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
2b1b0 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
2b1c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2b1d0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
2b1e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2b1f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2b200 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
2b210 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
2b220 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
2b230 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
2b240 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
2b250 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2b260 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2b270 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
2b280 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2b290 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
2b2a0 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
2b2b0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
2b2c0 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
2b2d0 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
2b2e0 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
2b2f0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
2b300 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
2b310 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2b320 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
2b330 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
2b340 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b350 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2b360 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b380 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2b390 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
2b3a0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
2b3b0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
2b3c0 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
2b3d0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
2b3e0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
2b3f0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
2b400 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
2b410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b420 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b430 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
2b440 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2b450 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
2b460 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
2b470 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
2b480 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
2b490 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2b4a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2b4b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
2b4c0 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
2b4d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2b4e0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
2b4f0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
2b500 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
2b510 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2b520 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2b530 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
2b540 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
2b550 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
2b560 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
2b570 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
2b580 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
2b590 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2b5a0 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
2b5b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2b5c0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2b5d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2b5e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b5f0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
2b600 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2b610 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ) ){.    const i
2b620 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49  nt flags =  SQLI
2b630 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2b640 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL | SQLITE_OPEN
2b650 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20  _READWRITE .    
2b660 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2b670 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
2b680 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a  OPEN_EXCLUSIVE .
2b690 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
2b6a0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2b6b0 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74  E;.    int nStmt
2b6c0 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43  Spill = sqlite3C
2b6d0 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c  onfig.nStmtSpill
2b6e0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
2b6f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2b700 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b710 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
2b720 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
2b730 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70  ){.      nStmtSp
2b740 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ill = -1;.    }.
2b750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b760 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2b770 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61  er->pVfs, 0, pPa
2b780 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73  ger->sjfd, flags
2b790 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20  , nStmtSpill);. 
2b7a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b7b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
2b7c0 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
2b7d0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
2b7e0 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
2b7f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
2b800 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2b810 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
2b820 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2b830 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
2b840 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
2b850 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
2b860 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
2b870 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
2b880 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2b890 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
2b8a0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2b8b0 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
2b8c0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
2b8d0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2b8e0 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
2b8f0 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
2b900 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
2b910 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
2b920 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
2b930 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
2b940 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
2b950 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
2b960 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2b970 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2b980 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b990 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
2b9a0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2b9b0 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
2b9c0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2b9d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b9e0 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
2b9f0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2ba00 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
2ba10 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
2ba20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
2ba30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2ba40 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2ba50 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2ba60 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2ba70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2ba80 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
2ba90 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2baa0 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
2bab0 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
2bac0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2bad0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2bae0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
2baf0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
2bb00 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20  r, pPg) .       
2bb10 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
2bb20 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2bb30 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
2bb40 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2bb50 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
2bb60 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
2bb70 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
2bb80 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
2bb90 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
2bba0 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
2bbb0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
2bbc0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
2bbd0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2bbe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bbf0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
2bc00 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2bc10 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2bc20 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
2bc30 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
2bc40 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
2bc50 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2bc60 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  2;..#if SQLITE_H
2bc70 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20  AS_CODEC   .    
2bc80 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
2bc90 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2bca0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2bcb0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2bcc0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2bcd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2bce0 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  KPT, pData2);.  
2bcf0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2bd00 0a 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20  .      pData2 = 
2bd10 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47  pData;.      PAG
2bd20 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
2bd30 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2bd40 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2bd50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2bd60 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
2bd70 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2bd80 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
2bd90 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2bda0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bdb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bdc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2bdd0 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
2bde0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
2bdf0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2be00 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
2be10 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2be20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2be30 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
2be40 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
2be50 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2be60 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
2be70 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
2be80 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
2be90 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2bea0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2beb0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2bec0 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2bed0 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29  ired(PgHdr *pPg)
2bee0 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75  {.  if( subjRequ
2bef0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2bf00 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a  .    return subj
2bf10 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2bf20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2bf30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bf40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2bf50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2bf60 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2bf70 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2bf80 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2bf90 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2bfa0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2bfb0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2bfc0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2bfd0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2bfe0 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2bff0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2c000 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2c010 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2c020 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2c030 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2c040 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2c050 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2c060 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2c070 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2c080 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2c090 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2c0a0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2c0b0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2c0c0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2c0d0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2c0e0 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2c0f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2c100 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2c110 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2c120 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2c130 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2c140 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2c150 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2c160 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2c170 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2c180 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2c190 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2c1a0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2c1b0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2c1c0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2c1d0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2c1e0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2c1f0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2c200 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2c210 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2c220 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2c230 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2c240 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c250 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2c260 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2c270 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2c280 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2c290 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2c2a0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2c2b0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2c2c0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2c2d0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2c2e0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2c2f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2c300 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2c310 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2c320 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2c330 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2c340 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c350 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2c360 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2c370 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2c380 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c390 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2c3a0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2c3b0 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2c3c0 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2c3d0 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2c3e0 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2c3f0 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2c400 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2c410 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2c420 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2c430 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2c440 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2c450 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2c460 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2c470 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2c480 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2c490 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2c4a0 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2c4b0 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2c4c0 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2c4d0 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2c4e0 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2c4f0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2c500 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2c510 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2c520 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2c530 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2c540 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2c550 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2c560 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2c570 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2c580 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2c590 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2c5a0 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2c5b0 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2c5c0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2c5d0 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2c5e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2c5f0 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2c600 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2c610 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2c620 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2c630 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a  h createFlag==3.
2c640 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2c650 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2c660 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2c670 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2c680 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2c690 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2c6a0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2c6b0 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2c6c0 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2c6d0 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2c6e0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2c6f0 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2c700 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2c710 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2c720 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2c730 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2c740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2c750 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2c760 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2c770 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2c780 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2c790 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2c7a0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2c7b0 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2c7c0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2c7d0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2c7e0 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2c7f0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2c800 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2c810 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2c820 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2c830 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2c840 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2c850 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2c860 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2c870 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2c880 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c890 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
2c8a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2c8b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2c8c0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2c8d0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
2c8e0 54 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  T.    /* If the 
2c8f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2c900 20 22 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45   "BEGIN CONCURRE
2c910 4e 54 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  NT" transaction,
2c920 20 74 68 65 20 70 61 67 65 20 0a 20 20 20 20 2a   the page .    *
2c930 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6c 75 73  * cannot be flus
2c940 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 52 65 74  hed to disk. Ret
2c950 75 72 6e 20 65 61 72 6c 79 20 69 6e 20 74 68 69  urn early in thi
2c960 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 69  s case. */.    i
2c970 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  f( pPager->pAllR
2c980 65 61 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ead ) return SQL
2c990 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
2c9a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
2c9b0 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
2c9c0 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
2c9d0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
2c9e0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2c9f0 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b  IfRequired(pPg);
2ca00 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
2ca10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ca20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
2ca30 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
2ca40 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
2ca50 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
2ca60 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
2ca70 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
2ca80 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2ca90 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2caa0 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
2cab0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2cac0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2cad0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
2cae0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
2caf0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2cb00 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
2cb10 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2cb20 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2cb30 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2cb40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2cb50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cb60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2cb70 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2cb80 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2cb90 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2cba0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2cbb0 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2cbc0 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2cbd0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2cbe0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2cbf0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2cc00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2cc10 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2cc20 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2cc30 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2cc40 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2cc50 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2cc60 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2cc70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2cc80 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2cc90 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  , rc); .}../*.**
2cca0 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66   Flush all unref
2ccb0 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70 61  erenced dirty pa
2ccc0 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ges to disk..*/.
2ccd0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2cce0 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50 61  Flush(Pager *pPa
2ccf0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2cd00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2cd10 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
2cd20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69  {.    PgHdr *pLi
2cd30 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
2cd40 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2cd50 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2cd60 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2cd70 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2cd80 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c  ger) );.    whil
2cd90 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2cda0 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
2cdb0 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
2cdc0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
2cdd0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2cde0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2cdf0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
2ce00 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61  tress((void*)pPa
2ce10 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  ger, pList);.   
2ce20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74     }.      pList
2ce30 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   = pNext;.    }.
2ce40 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2ce50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2ce60 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2ce70 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
2ce80 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
2ce90 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
2cea0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
2ceb0 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
2cec0 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
2ced0 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
2cee0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
2cef0 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
2cf00 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
2cf10 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2cf20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
2cf30 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2cf40 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
2cf50 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
2cf60 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
2cf70 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2cf80 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
2cf90 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
2cfa0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
2cfb0 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
2cfc0 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
2cfd0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2cfe0 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
2cff0 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
2d000 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
2d010 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
2d020 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
2d030 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
2d040 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2d050 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
2d060 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
2d070 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
2d080 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2d090 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
2d0a0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
2d0b0 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
2d0c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
2d0d0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
2d0e0 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
2d0f0 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
2d100 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
2d110 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
2d120 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
2d130 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2d140 45 78 74 72 61 28 29 20 41 50 49 2e 20 20 57 68  Extra() API.  Wh
2d150 65 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69 73  en a new page is
2d160 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a   allocated, the.
2d170 2a 2a 20 66 69 72 73 74 20 38 20 62 79 74 65 73  ** first 8 bytes
2d180 20 6f 66 20 74 68 69 73 20 73 70 61 63 65 20 61   of this space a
2d190 72 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74 68  re zeroed but th
2d1a0 65 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20 75  e remainder is u
2d1b0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a  ninitialized..**
2d1c0 20 28 54 68 65 20 65 78 74 72 61 20 73 70 61 63   (The extra spac
2d1d0 65 20 69 73 20 75 73 65 64 20 62 79 20 62 74 72  e is used by btr
2d1e0 65 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61 67  ee as the MemPag
2d1f0 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a  e object.).**.**
2d200 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
2d210 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
2d220 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
2d230 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
2d240 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
2d250 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
2d260 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
2d270 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
2d280 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
2d290 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  the PAGER_* flag
2d2a0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
2d2b0 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
2d2c0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
2d2d0 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
2d2e0 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
2d2f0 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
2d300 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
2d310 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
2d320 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
2d330 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
2d340 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
2d350 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
2d360 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
2d370 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
2d380 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
2d390 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
2d3a0 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
2d3b0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
2d3c0 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
2d3d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2d3e0 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
2d3f0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
2d400 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
2d410 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
2d420 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2d430 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
2d440 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
2d450 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
2d460 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
2d470 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2d480 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
2d490 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
2d4a0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
2d4b0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
2d4c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2d4d0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
2d4e0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
2d4f0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
2d500 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
2d510 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2d520 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
2d530 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
2d540 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2d550 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
2d560 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2d570 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2d580 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
2d590 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
2d5a0 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
2d5b0 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
2d5c0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2d5d0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d5f0 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
2d600 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
2d610 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
2d620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2d630 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
2d640 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
2d650 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
2d660 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
2d670 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
2d680 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
2d690 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
2d6a0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
2d6b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
2d6c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
2d6d0 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
2d6e0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
2d6f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d700 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
2d710 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2d720 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
2d730 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d740 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
2d750 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
2d760 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
2d770 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
2d780 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d790 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2d7a0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
2d7b0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
2d7c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d7d0 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
2d7e0 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
2d7f0 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
2d800 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
2d810 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2d820 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2d830 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
2d840 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2d850 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
2d860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2d870 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
2d880 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
2d890 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2d8a0 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
2d8b0 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
2d8c0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
2d8d0 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
2d8e0 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
2d8f0 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
2d900 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
2d910 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2d920 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
2d930 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2d940 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
2d950 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c  .  u32 szPageDfl
2d960 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2d970 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
2d980 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
2d990 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ize */.  const c
2d9a0 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20  har *zUri = 0;  
2d9b0 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f    /* URI args to
2d9c0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   copy */.  int n
2d9d0 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Uri = 0;        
2d9e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d9f0 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72   bytes of URI ar
2da00 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a  gs at *zUri */..
2da10 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
2da20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
2da30 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  s required for e
2da40 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ach journal file
2da50 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68  -handle.  ** (th
2da60 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74  ere are two of t
2da70 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f  hem, the main jo
2da80 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75  urnal and the su
2da90 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a  b-journal).  */.
2daa0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2dab0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2dac0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2dad0 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  fs));..  /* Set 
2dae0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2daf0 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2db00 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2db10 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2db20 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2db30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2db40 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2db50 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2db60 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2db70 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  1;.    if( zFile
2db80 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2db90 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50  e[0] ){.      zP
2dba0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2dbb0 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69  3DbStrDup(0, zFi
2dbc0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
2dbd0 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2dbe0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2dbf0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2dc00 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2dc10 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2dc20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2dc30 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2dc40 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2dc50 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2dc60 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2dc70 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2dc80 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2dc90 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2dca0 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2dcb0 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2dcc0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2dcd0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2dce0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2dcf0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2dd00 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2dd10 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2dd20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2dd30 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2dd40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2dd50 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2dd60 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2dd70 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2dd80 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
2dd90 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e  locRaw(0, nPathn
2dda0 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
2ddb0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
2ddc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ddd0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2dde0 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e      }.    zPathn
2ddf0 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d  ame[0] = 0; /* M
2de00 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c  ake sure initial
2de10 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c  ized even if Ful
2de20 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c  lPathname() fail
2de30 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  s */.    rc = sq
2de40 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
2de50 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2de60 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
2de70 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2de80 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2de90 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2dea0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  hname);.    z = 
2deb0 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d  zUri = &zFilenam
2dec0 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
2ded0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b  0(zFilename)+1];
2dee0 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
2def0 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  {.      z += sql
2df00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2df10 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  1;.      z += sq
2df20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2df30 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55  +1;.    }.    nU
2df40 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d  ri = (int)(&z[1]
2df50 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73   - zUri);.    as
2df60 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b  sert( nUri>=0 );
2df70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2df80 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
2df90 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
2dfa0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
2dfb0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
2dfc0 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
2dfd0 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
2dfe0 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2dff0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2e000 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
2e010 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
2e020 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
2e030 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
2e040 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
2e050 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
2e060 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
2e070 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
2e080 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
2e090 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
2e0a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2e0b0 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
2e0c0 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
2e0d0 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
2e0e0 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
2e0f0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2e100 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2e110 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
2e120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e140 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2e150 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
2e160 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
2e170 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2e180 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50  memory for the P
2e190 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
2e1a0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74  PCache object, t
2e1b0 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69  he.  ** three fi
2e1c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
2e1d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e1e0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a  e name and the j
2e1f0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
2e200 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f  e name. The layo
2e210 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20  ut in memory is 
2e220 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
2e230 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20  .  **     Pager 
2e240 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2e250 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
2e260 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a  f(Pager) bytes).
2e270 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20    **     PCache 
2e280 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2e290 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2e2a0 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79  3PcacheSize() by
2e2b0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2e2c0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
2e2d0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70  le            (p
2e2e0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79  Vfs->szOsFile by
2e2f0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75  tes).  **     Su
2e300 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  b-journal file h
2e310 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a  andle         (j
2e320 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2e330 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d  ytes).  **     M
2e340 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
2e350 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28   handle        (
2e360 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2e370 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2e380 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  Database file na
2e390 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2e3a0 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74  (nPathname+1 byt
2e3b0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75  es).  **     Jou
2e3c0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20  rnal file name  
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2e3e0 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65  athname+8+1 byte
2e3f0 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d  s).  */.  pPtr =
2e400 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61   (u8 *)sqlite3Ma
2e410 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f  llocZero(.    RO
2e420 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2e430 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20  ger)) +      /* 
2e440 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2e450 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63  */.    ROUND8(pc
2e460 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20  acheSize) +     
2e470 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
2e480 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f  object */.    RO
2e490 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2e4a0 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  ile) +       /* 
2e4b0 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
2e4c0 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
2e4d0 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
2e4e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
2e4f0 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
2e500 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  */ .    nPathnam
2e510 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20  e + 1 + nUri +  
2e520 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
2e530 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68  ame */.    nPath
2e540 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20  name + 8 + 2    
2e550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f            /* zJo
2e560 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
2e570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2e580 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65  .    + nPathname
2e590 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20   + 4 + 2        
2e5a0 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
2e5b0 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
2e5c0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2e5d0 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
2e5e0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
2e5f0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
2e600 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
2e610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e620 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2e630 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e640 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2e650 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2e660 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2e670 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2e680 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2e690 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2e6a0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2e6b0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2e6c0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2e6d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2e6e0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2e6f0 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2e700 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2e710 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2e720 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2e730 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2e740 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2e750 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2e760 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2e770 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2e780 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2e790 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2e7a0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2e7b0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2e7c0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2e7d0 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2e7e0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2e7f0 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2e800 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2e810 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2e820 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2e830 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2e840 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e850 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2e860 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2e870 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2e880 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2e890 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2e8a0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2e8b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2e8c0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2e8d0 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  e);.    if( nUri
2e8e0 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65   ) memcpy(&pPage
2e8f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
2e900 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c  thname+1], zUri,
2e910 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2e920 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
2e930 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
2e940 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2e950 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2e960 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2e970 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30  me], "-journal\0
2e980 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73  00", 8+2);.    s
2e990 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2e9a0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2e9b0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ame, pPager->zJo
2e9c0 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20  urnal);.#ifndef 
2e9d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2e9e0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c      pPager->zWal
2e9f0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   = &pPager->zJou
2ea00 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38  rnal[nPathname+8
2ea10 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1];.    memcpy(
2ea20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
2ea30 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2ea40 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2ea50 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2ea60 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c  athname], "-wal\
2ea70 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20  000", 4+1);.    
2ea80 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2ea90 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2eaa0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57  name, pPager->zW
2eab0 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  al);.#endif.    
2eac0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2ead0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d   zPathname);.  }
2eae0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
2eaf0 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
2eb00 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
2eb10 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
2eb20 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
2eb30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2eb40 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2eb50 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
2eb60 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
2eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb80 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
2eb90 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
2eba0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2ebb0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2ebc0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2ebd0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
2ebe0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
2ebf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65  .    assert( !me
2ec00 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f  mDb );.    readO
2ec10 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2ec20 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2ec30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2ec40 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2ec50 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2ec60 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2ec70 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2ec80 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2ec90 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2eca0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2ecb0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2ecc0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2ecd0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2ece0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2ecf0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2ed00 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2ed10 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2ed20 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2ed30 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2ed40 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2ed50 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2ed60 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2ed70 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2ed80 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2ed90 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2eda0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2edb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2edc0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2edd0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2ede0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2edf0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2ee00 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2ee10 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2ee20 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2ee30 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2ee40 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2ee50 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2ee60 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2ee70 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2ee80 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2ee90 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2eea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2eeb0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2eec0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2eed0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2eee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2eef0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2ef00 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2ef10 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2ef20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ef30 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2ef40 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2ef50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2ef60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ef70 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2ef80 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2ef90 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2efa0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2efb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2efc0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2efd0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2efe0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2eff0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2f000 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2f010 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2f020 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2f030 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f040 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2f050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2f060 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2f070 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2f080 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f090 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2f0a0 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2f0b0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2f0c0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2f0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2f0e0 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2f0f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f110 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2f120 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2f130 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2f140 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2f150 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2f160 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2f170 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2f180 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2f190 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2f1a0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2f1b0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2f1c0 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2f1d0 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2f1e0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2f1f0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2f200 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2f210 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2f220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2f230 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2f240 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2f250 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2f260 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2f270 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2f280 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2f290 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2f2a0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2f2b0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2f2c0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2f2d0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2f2e0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2f2f0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2f300 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2f310 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2f320 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2f330 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2f340 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2f350 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2f360 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2f370 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2f380 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2f390 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2f3a0 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2f3b0 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2f3c0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2f3d0 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2f3e0 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2f3f0 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2f400 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2f410 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2f420 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2f430 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2f440 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2f450 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2f460 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2f470 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2f480 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2f490 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2f4a0 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2f4b0 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2f4c0 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20   EXCLUSIVE mode 
2f4d0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2f4e0 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2f4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2f500 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2f510 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2f520 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2f530 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2f540 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2f550 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2f560 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2f570 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2f580 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2f590 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2f5a0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2f5b0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2f5c0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2f5d0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2f5e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2f5f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2f600 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2f610 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2f620 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2f630 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2f640 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2f650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f660 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2f670 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2f680 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2f690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f6a0 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20  K ){.    nExtra 
2f6b0 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
2f6c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
2f6d0 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72  xtra>=8 && nExtr
2f6e0 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63  a<1000 );.    rc
2f6f0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2f700 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2f710 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2f720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f730 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2f740 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2f750 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2f760 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2f770 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2f780 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61  error occurred a
2f790 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20  bove, free the  
2f7a0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2f7b0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2f7c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2f7d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f7e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2f7f0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2f800 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
2f810 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
2f820 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  Space);.    sqli
2f830 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2f840 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2f850 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2f860 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2f870 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2f880 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2f890 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2f8a0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2f8b0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2f8c0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2f8d0 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2f8e0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2f8f0 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2f900 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2f910 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2f920 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2f930 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2f940 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2f950 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f960 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2f970 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f980 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2f990 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f9a0 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2f9b0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2f9c0 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2f9d0 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
2f9e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2f9f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
2fa00 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
2fa10 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
2fa20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2fa30 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2fa40 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
2fa50 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2fa60 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
2fa70 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
2fa80 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2fa90 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2faa0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2fab0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2fac0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
2fad0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
2fae0 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
2faf0 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
2fb00 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2fb10 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
2fb20 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2fb30 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
2fb40 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
2fb50 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
2fb60 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
2fb70 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
2fb80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2fb90 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
2fba0 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
2fbb0 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
2fbc0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2fbd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2fbe0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30  ger->fullSync==0
2fbf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2fc00 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
2fc10 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2fc20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
2fc30 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2fc40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fc50 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
2fc60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2fc70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2fc80 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  lags==0 );.  }el
2fc90 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
2fca0 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20  fullSync = 1;.  
2fcb0 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
2fcc0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
2fcd0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
2fce0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2fcf0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
2fd00 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
2fd10 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2fd20 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52  AL | WAL_SYNC_TR
2fd30 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20  ANSACTIONS;.    
2fd40 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2fd50 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2fd60 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
2fd70 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2fd80 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2fd90 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2fda0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2fdb0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2fdc0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2fdd0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2fde0 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2fdf0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2fe00 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2fe10 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2fe20 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2fe30 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2fe40 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2fe50 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2fe60 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2fe70 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2fe80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2fe90 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2fea0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2feb0 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2fec0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2fed0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2fee0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2fef0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2ff00 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2ff10 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2ff20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ff30 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2ff40 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2ff50 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2ff60 65 69 6e 69 74 3b 0a 20 20 73 65 74 47 65 74 74  einit;.  setGett
2ff70 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
2ff80 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2ff90 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2ffa0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2ffb0 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
2ffc0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
2ffd0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ffe0 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
2fff0 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
30000 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
30010 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
30020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30030 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
30040 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
30050 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
30060 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
30070 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  med out from.** 
30080 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e  under the pager.
30090 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
300a0 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61  OK if the databa
300b0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65  se is still were
300c0 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20   it ought.** to 
300d0 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74  be on disk.  Ret
300e0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51  urn non-zero (SQ
300f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
30100 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74  MOVED or some ot
30110 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  her error.** cod
30120 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73  e from sqlite3Os
30130 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65  Access()) if the
30140 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f   database has go
30150 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73  ne missing..*/.s
30160 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61  tatic int databa
30170 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65  seIsUnmoved(Page
30180 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
30190 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b  t bHasMoved = 0;
301a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
301b0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
301c0 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
301d0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
301e0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29  ger->dbSize==0 )
301f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30200 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
30210 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26  ger->zFilename &
30220 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  & pPager->zFilen
30230 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d  ame[0] );.  rc =
30240 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
30250 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
30260 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  , SQLITE_FCNTL_H
30270 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d  AS_MOVED, &bHasM
30280 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  oved);.  if( rc=
30290 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
302a0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
302b0 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65  e HAS_MOVED file
302c0 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d  -control is unim
302d0 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d  plemented, assum
302e0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a  e that the file.
302f0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
30300 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74  een moved.  That
30310 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63   is the historic
30320 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53  al behavior of S
30330 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a  QLite: prior to.
30340 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
30350 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63  .8.3, it never c
30360 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63  hecked */.    rc
30370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30380 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
30390 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d  LITE_OK && bHasM
303a0 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  oved ){.    rc =
303b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
303c0 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20  _DBMOVED;.  }.  
303d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
303e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
303f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
30400 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
30410 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
30420 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
30430 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
30440 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
30450 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
30460 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
30470 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
30480 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
30490 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
304a0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
304b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
304c0 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
304d0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
304e0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
304f0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
30500 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
30510 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
30520 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
30530 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
30540 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
30550 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
30560 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
30570 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
30580 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
30590 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
305a0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
305b0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
305c0 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
305d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
305e0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
305f0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
30600 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
30610 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
30620 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
30630 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
30640 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
30650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30660 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
30670 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
30680 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
30690 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
306a0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
306b0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
306c0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
306d0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
306e0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
306f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
30700 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
30710 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
30720 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
30730 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
30740 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
30750 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
30760 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
30770 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
30780 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
30790 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
307a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
307b0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
307c0 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
307d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
307e0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
307f0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
30800 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
30810 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
30820 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
30830 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
30840 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
30850 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
30860 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
30870 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
30880 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
30890 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
308a0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
308b0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
308c0 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
308d0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
308e0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
308f0 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
30900 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
30910 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
30920 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
30930 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
30940 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
30950 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
30960 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
30970 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
30980 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
30990 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
309a0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
309b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
309c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
309d0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
309e0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
309f0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
30a00 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
30a10 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
30a20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
30a30 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
30a40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
30a50 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
30a60 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
30a70 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
30a80 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
30a90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30ab0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
30ac0 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
30ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30ae0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
30af0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
30b00 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
30b10 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
30b20 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
30b30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
30b40 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
30b50 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
30b60 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
30b70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
30b80 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30b90 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
30ba0 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
30bb0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
30bc0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
30bd0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
30be0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
30bf0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
30c00 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
30c10 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
30c20 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
30c30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
30c40 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
30c50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30c60 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
30c70 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
30c80 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
30c90 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
30ca0 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
30cb0 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
30cc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30cd0 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
30ce0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
30cf0 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
30d00 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
30d10 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
30d20 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
30d30 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
30d40 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
30d50 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
30d60 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
30d70 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
30d80 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
30d90 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
30da0 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
30db0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
30dc0 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
30dd0 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
30de0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
30df0 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
30e00 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
30e10 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
30e20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
30e30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
30e40 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
30e50 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
30e60 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
30e70 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
30e80 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
30e90 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
30ea0 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
30eb0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
30ec0 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
30ed0 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
30ee0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
30ef0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
30f00 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
30f10 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
30f20 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
30f30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30f40 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
30f50 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
30f60 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
30f70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30f80 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
30f90 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
30fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30fb0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
30fc0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
30fd0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
30fe0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
30ff0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31010 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
31020 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65  ase is zero page
31030 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20  s in size, that 
31040 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
31050 72 20 28 31 29 20 74 68 65 0a 20 20 20 20 20 20  r (1) the.      
31060 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20    ** journal is 
31070 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61  a remnant from a
31080 20 70 72 69 6f 72 20 64 61 74 61 62 61 73 65 20   prior database 
31090 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
310a0 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20 20 20  me where.       
310b0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
310c0 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68   file but not th
310d0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65  e journal was de
310e0 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68  leted, or (2) th
310f0 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20  e initial.      
31100 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
31110 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20   that populates 
31120 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
31130 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
31140 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ack..        ** 
31150 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
31160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31170 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
31180 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20    However, take 
31190 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  care.        ** 
311a0 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  not to delete th
311b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
311c0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
311d0 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20  open due to.    
311e0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d      ** journal_m
311f0 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20  ode=PERSIST..   
31200 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31210 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20  if( nPage==0 && 
31220 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
31230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
31240 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
31250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31260 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
31270 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
31280 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  CK)==SQLITE_OK )
31290 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
312a0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
312b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
312c0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
312d0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
312e0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
312f0 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   ) pagerUnlockDb
31300 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
31310 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
31320 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
31330 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
31340 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
31350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31360 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
31370 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
31380 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
31390 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
313a0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
313b0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
313c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
313d0 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
313e0 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
313f0 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
31400 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
31410 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
31420 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
31430 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
31440 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
31450 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
31460 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
31470 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
31480 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
31490 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
314a0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
314b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
314c0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
314d0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
314e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
314f0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
31500 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
31510 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31520 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
31530 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
31540 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
31550 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
31560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31590 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
315a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
315b0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
315c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
315d0 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
315e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
315f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
31600 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
31610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31630 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
31650 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
31660 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31670 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
31680 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
31690 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
316a0 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
316b0 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
316c0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
316d0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
316e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
316f0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
31700 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
31710 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
31720 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
31730 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
31740 74 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  t has a zero hea
31750 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
31760 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
31770 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
31780 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
31790 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
317a0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
317b0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
317c0 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
317d0 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
317e0 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
317f0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
31800 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
31810 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31820 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
31830 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
31840 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
31850 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
31860 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
31870 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
31880 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
31890 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
318a0 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
318b0 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
318c0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
318d0 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
318e0 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
318f0 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
31900 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
31910 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
31920 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
31930 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
31940 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
31950 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
31960 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31980 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31990 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
319a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
319b0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
319c0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
319d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
319e0 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
319f0 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
31a00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31a10 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
31a20 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
31a30 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
31a40 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
31a50 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
31a60 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
31a70 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
31a80 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
31a90 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
31aa0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
31ab0 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
31ac0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
31ad0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
31ae0 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
31af0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
31b00 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
31b10 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
31b20 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
31b30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31b40 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
31b50 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
31b60 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
31b70 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
31b80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31b90 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
31ba0 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
31bb0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
31bc0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
31bd0 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
31be0 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
31bf0 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
31c00 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
31c10 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
31c20 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
31c30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
31c40 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
31c50 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
31c60 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
31c70 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
31c80 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
31c90 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
31ca0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
31cb0 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
31cc0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
31cd0 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
31ce0 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
31cf0 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
31d00 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
31d10 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
31d20 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
31d30 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
31d40 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
31d50 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
31d60 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
31d70 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
31d80 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31d90 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
31da0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
31db0 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
31dc0 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
31dd0 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
31de0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
31df0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
31e00 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
31e10 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
31e20 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
31e30 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
31e40 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
31e50 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
31e60 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
31e70 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
31e80 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
31e90 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
31ea0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
31eb0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
31ec0 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
31ed0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
31ee0 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
31ef0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
31f00 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
31f10 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
31f20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
31f30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
31f40 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
31f50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
31f60 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
31f70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
31f80 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
31f90 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
31fa0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
31fb0 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
31fc0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
31fd0 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
31fe0 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
31ff0 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
32000 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
32010 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
32020 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
32030 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
32040 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
32050 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 20  ve access mode. 
32060 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
32070 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
32080 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
32090 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
320a0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
320b0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
320c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
320d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
320e0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
320f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32100 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
32110 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
32120 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
32130 29 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  );..  if( !pager
32140 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
32150 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
32160 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  ==PAGER_OPEN ){.
32170 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72      int bHotJour
32180 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20  nal = 1;        
32190 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
321a0 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20  re exists a hot 
321b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a  journal-file */.
321c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
321d0 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
321e0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
321f0 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ile==0 || pPager
32200 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
32210 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20  VE_LOCK );..    
32220 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
32230 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
32240 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
32250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
32270 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
32280 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
32290 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
322a0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
322b0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
322c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
322d0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
322e0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
322f0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
32300 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
32310 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
32320 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
32330 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
32340 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
32350 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
32360 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
32370 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
32380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
32390 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
323a0 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61  ger, &bHotJourna
323b0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
323c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
323d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  ){.      goto fa
323e0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
323f0 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  if( bHotJournal 
32400 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
32410 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
32420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
32430 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
32440 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
32450 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32460 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
32470 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
32480 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32490 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
324a0 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
324b0 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
324c0 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
324d0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
324e0 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
324f0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
32500 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
32510 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
32520 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
32530 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
32540 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
32550 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
32560 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
32570 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
32580 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
32590 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
325a0 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
325b0 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
325c0 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
325d0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
325e0 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
325f0 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
32600 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
32610 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
32620 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
32630 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
32640 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
32650 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
32660 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
32670 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
32680 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
32690 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
326a0 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
326b0 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
326c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
326d0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
326e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
326f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32700 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
32710 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  er is in locking
32720 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
32730 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69  mode, the lock i
32740 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67  s.      ** downg
32750 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f  raded to SHARED_
32760 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73  LOCK before this
32770 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
32780 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
32790 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
327a0 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
327b0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
327c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
327d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
327e0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
327f0 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49    }. .      /* I
32800 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
32810 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65  ady open and the
32820 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20   file exists on 
32830 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a  disk, open the .
32840 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
32850 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
32860 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63  access. Write ac
32870 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64  cess is required
32880 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20   because .      
32890 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ** in exclusive-
328a0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
328b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
328c0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
328d0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  n .      ** and 
328e0 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
328f0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
32900 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20  later on. Also, 
32910 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20  write-access .  
32920 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c      ** is usuall
32930 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69  y required to fi
32940 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
32950 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  al in journal_mo
32960 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20  de=persist .    
32970 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61    ** mode (and a
32980 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f  lso for journal_
32990 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e  mode=truncate on
329a0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a   some systems)..
329b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
329c0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
329d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
329e0 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e   it usually mean
329f0 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20  s that some .   
32a00 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
32a10 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74  ection managed t
32a20 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c  o get in and rol
32a30 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65  l it back before
32a40 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
32a50 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69  connection obtai
32a60 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ned the exclusiv
32a70 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72  e lock above. Or
32a80 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  , it .      ** m
32a90 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ay mean that the
32aa0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68   pager was in th
32ab0 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
32ac0 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  en this.      **
32ad0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
32ae0 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75  lled and the jou
32af0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
32b00 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
32b10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
32b20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
32b40 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
32b50 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
32b60 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e  pVfs;.        in
32b70 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20  t bExists;      
32b80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
32b90 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
32ba0 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
32bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
32bc0 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
32bd0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
32be0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
32bf0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
32c00 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20  , &bExists);.   
32c10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32c20 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74  ITE_OK && bExist
32c30 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
32c40 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
32c50 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
32c60 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
32c70 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
32c80 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
32c90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
32ca0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
32cb0 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
32cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
32cd0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
32ce0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
32cf0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
32d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
32d10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
32d20 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
32d30 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
32d40 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32d50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
32d60 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
32d70 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
32d80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32d90 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
32da0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32db0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
32dc0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
32dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
32de0 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
32df0 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
32e00 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
32e10 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
32e20 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
32e30 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
32e40 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
32e50 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
32e60 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
32e70 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
32e80 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
32e90 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
32ea0 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
32eb0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
32ec0 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
32ed0 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a    Sync the hot j
32ee0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
32ef0 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69  aying.      ** i
32f00 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65  t back since the
32f10 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
32f20 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74  ashed and left t
32f30 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20  he hot journal. 
32f40 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
32f50 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74   did not sync it
32f60 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75   and we are requ
32f70 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73  ired to always s
32f80 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ync.      ** the
32f90 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
32fa0 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e  playing it back.
32fb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32fc0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
32fd0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
32fe0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
32ff0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
33000 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79      rc = pagerSy
33010 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
33020 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
33030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
33050 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
33060 28 70 50 61 67 65 72 2c 20 21 70 50 61 67 65 72  (pPager, !pPager
33070 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20  ->tempFile);.   
33080 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
33090 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
330a0 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EN;.        }.  
330b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
330c0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
330d0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
330e0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
330f0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
33100 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  K);.      }..   
33110 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33130 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
33140 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72  s taken if an er
33150 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
33160 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a   trying to open.
33170 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f          ** or ro
33180 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ll back a hot-jo
33190 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64  urnal while hold
331a0 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
331b0 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
331c0 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     ** pager_unlo
331d0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
331e0 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  l be called befo
331f0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20  re returning to 
33200 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a  unlock.        *
33210 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  * the file. If t
33220 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70  he unlock attemp
33230 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61  t fails, then Pa
33240 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ger.eLock must b
33250 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  e.        ** set
33260 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
33270 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e   (see the commen
33280 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
33290 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20  ine for .       
332a0 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   ** UNKNOWN_LOCK
332b0 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78   above for an ex
332c0 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20  planation). .   
332d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
332e0 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67  ** In order to g
332f0 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  et pager_unlock(
33300 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65  ) to do this, se
33310 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  t Pager.eState t
33320 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47  o.        ** PAG
33330 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68  ER_ERROR now. Th
33340 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
33350 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20  ly counted as a 
33360 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20  transition.     
33370 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73     ** to ERROR s
33380 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74  tate in the stat
33390 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65  e diagram at the
333a0 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
333b0 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  e,.        ** si
333c0 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
333d0 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74   the same call t
333e0 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
333f0 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20   will very.     
33400 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72     ** shortly tr
33410 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67  ansition the pag
33420 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
33430 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c   OPEN state. Cal
33440 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ling.        ** 
33450 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
33460 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20  te() would fail 
33470 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c  now, as it shoul
33480 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  d not be possibl
33490 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
334a0 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  be in ERROR stat
334b0 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  e when there are
334c0 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e   zero outstandin
334d0 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20  g page .        
334e0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20  ** references.. 
334f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33500 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
33510 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
33520 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
33530 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
33540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33550 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
33560 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  N );.      asser
33570 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
33580 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  k==SHARED_LOCK).
33590 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
335a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
335b0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
335c0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
335d0 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  K).      );.    
335e0 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
335f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
33600 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
33610 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20  haredLock ){.   
33620 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
33630 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
33640 65 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65  een acquired the
33650 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20  n check to.     
33660 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64   ** see if the d
33670 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
33680 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
33690 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
336a0 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a  changed,.      *
336b0 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  * flush the cach
336c0 65 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64 53  e.  The hasHeldS
336d0 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70  haredLock flag p
336e0 72 65 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f  revents this fro
336f0 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72  m.      ** occur
33700 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79  ring on the very
33710 20 66 69 72 73 74 20 61 63 63 65 73 73 20 74 6f   first access to
33720 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65   a file, in orde
33730 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20  r to save a.    
33740 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65    ** single unne
33750 63 65 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f  cessary sqlite3O
33760 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20  sRead() call at 
33770 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20  the start-up..  
33780 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
33790 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
337a0 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
337b0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
337c0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
337d0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
337e0 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
337f0 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
33800 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
33810 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
33820 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
33830 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
33840 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
33850 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
33860 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
33870 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
33880 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
33890 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
338a0 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
338b0 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
338c0 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
338d0 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
338e0 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
338f0 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
33900 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
33910 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
33920 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
33930 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
33940 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
33950 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
33960 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
33970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
33980 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20  gno nPage = 0;. 
33990 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
339a0 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
339b0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
339c0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ;..      rc = pa
339d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
339e0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
339f0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
33a00 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20  o failed;..     
33a10 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
33a20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
33a30 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
33a40 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
33a50 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
33a60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
33a70 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
33a80 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
33a90 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
33aa0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
33ab0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33ac0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
33ad0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
33ae0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
33af0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
33b00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33b20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
33b30 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
33b40 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
33b50 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
33b60 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
33b70 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
33b80 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
33b90 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
33ba0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
33bb0 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
33bc0 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
33bd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33be0 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
33bf0 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
33c00 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
33c10 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
33c20 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
33c30 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
33c40 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
33c50 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
33c60 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
33c70 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
33c80 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
33c90 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
33ca0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
33cb0 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
33cc0 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
33cd0 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
33ce0 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
33cf0 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
33d00 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
33d10 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
33d20 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
33d30 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
33d40 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
33d50 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
33d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
33d70 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
33d80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
33d90 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
33da0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
33db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33dc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
33dd0 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
33de0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
33df0 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
33e00 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
33e10 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
33e20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
33e30 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
33e40 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
33e50 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
33e60 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
33e70 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
33e80 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
33e90 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
33ea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
33eb0 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
33ec0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
33ed0 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
33ee0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33ef0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
33f00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33f10 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
33f20 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
33f30 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
33f40 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
33f50 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70  tempFile==0 && p
33f60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33f70 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
33f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33f90 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
33fa0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
33fb0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
33fc0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
33fd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33fe0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
33ff0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
34000 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
34010 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
34020 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34030 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
34040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
34050 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
34060 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
34070 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
34080 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
34090 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
340a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
340b0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
340c0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
340d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
340e0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
340f0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
34100 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
34110 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
34120 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
34130 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
34140 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
34150 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
34160 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
34170 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
34180 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
34190 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
341a0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
341b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
341c0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
341d0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
341e0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
341f0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
34200 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d  ager->nMmapOut==
34210 30 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61  0 && (sqlite3Pca
34220 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
34230 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
34240 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
34250 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
34260 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
34270 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 67 65  *.** The page ge
34280 74 74 65 72 20 6d 65 74 68 6f 64 73 20 65 61 63  tter methods eac
34290 68 20 74 72 79 20 74 6f 20 61 63 71 75 69 72 65  h try to acquire
342a0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
342b0 61 0a 2a 2a 20 70 61 67 65 20 77 69 74 68 20 70  a.** page with p
342c0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
342d0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
342e0 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
342f0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
34300 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
34310 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
34320 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
34330 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
34340 54 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  There are differ
34350 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
34360 6f 6e 73 20 6f 66 20 74 68 65 20 67 65 74 74 65  ons of the gette
34370 72 20 6d 65 74 68 6f 64 20 64 65 70 65 6e 64 69  r method dependi
34380 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72  ng.** on the cur
34390 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
343a0 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  e pager..**.**  
343b0 20 20 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c     getPageNormal
343c0 28 29 20 20 20 20 20 20 20 20 20 2d 2d 20 20 54  ()         --  T
343d0 68 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72  he normal getter
343e0 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 45  .**     getPageE
343f0 72 72 6f 72 28 29 20 20 20 20 20 20 20 20 20 20  rror()          
34400 2d 2d 20 20 55 73 65 64 20 69 66 20 74 68 65 20  --  Used if the 
34410 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
34420 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20  rror state.**   
34430 20 20 67 65 74 50 61 67 65 4d 6d 61 70 28 29 20    getPageMmap() 
34440 20 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73            --  Us
34450 65 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70  ed if memory-map
34460 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c  ped I/O is enabl
34470 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  ed.**.** If the 
34480 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
34490 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
344a0 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
344b0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
344c0 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
344d0 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
344e0 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
344f0 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
34500 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
34510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
34520 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
34530 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
34540 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
34550 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
34560 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
34570 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
34580 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
34590 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
345a0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
345b0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
345c0 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
345d0 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
345e0 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
345f0 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
34600 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
34610 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
34620 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
34630 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
34640 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
34650 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
34660 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
34670 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
34680 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
34690 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
346a0 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
346b0 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
346c0 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
346d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
346e0 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
346f0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
34700 64 20 70 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a  d page or if .**
34710 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
34720 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68  eter contains th
34730 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
34740 4e 54 45 4e 54 20 62 69 74 20 61 6e 64 20 74 68  NTENT bit and th
34750 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
34760 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
34770 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
34780 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
34790 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
347a0 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
347b0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
347c0 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
347d0 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
347e0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
347f0 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
34800 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  If PAGER_GET_NOC
34810 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20  ONTENT is true, 
34820 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
34830 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
34840 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
34850 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ts of the page. 
34860 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
34870 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
34880 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65  .**   a) When re
34890 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73  ading a free-lis
348a0 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  t leaf page from
348b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
348c0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68  nd.**.**   b) Wh
348d0 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69  en a savepoint i
348e0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
348f0 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20  ack and we need 
34900 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  to load.**      
34910 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20  a new page into 
34920 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20  the cache to be 
34930 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
34940 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
34950 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
34960 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
34970 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54  .** If PAGER_GET
34980 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72  _NOCONTENT is tr
34990 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
349a0 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
349b0 72 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20  roed instead.** 
349c0 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  of being read fr
349d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
349e0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
349f0 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
34a00 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
34a10 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
34a20 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
34a30 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
34a40 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
34a50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
34a60 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
34a70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
34a80 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
34a90 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
34aa0 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
34ab0 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
34ac0 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
34ad0 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
34ae0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
34af0 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
34b00 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
34b10 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
34b20 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
34b30 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
34b40 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
34b50 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
34b60 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
34b70 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
34b80 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
34b90 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
34ba0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
34bb0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
34bc0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
34bd0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
34be0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
34bf0 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
34c00 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
34c10 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
34c20 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
34c30 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
34c40 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
34c50 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
34c60 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
34c70 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
34c80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
34c90 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
34ca0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
34cb0 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
34cc0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
34cd0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
34ce0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
34cf0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
34d00 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
34d10 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
34d20 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
34d30 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
34d40 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
34d50 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
34d60 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
34d70 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
34d80 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
34d90 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
34da0 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  files..*/.static
34db0 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d   int getPageNorm
34dc0 61 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  al(.  Pager *pPa
34dd0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
34de0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
34df0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34e00 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
34e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
34e20 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
34e30 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
34e40 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
34e50 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
34e60 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
34e70 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
34e80 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
34e90 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
34ea0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
34eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
34ec0 64 72 20 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f  dr *pPg;.  u8 no
34ed0 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20  Content;        
34ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
34ef0 75 65 20 69 66 20 50 41 47 45 52 5f 47 45 54 5f  ue if PAGER_GET_
34f00 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73 65 74  NOCONTENT is set
34f10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70 63   */.  sqlite3_pc
34f20 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65  ache_page *pBase
34f30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
34f40 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
34f50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
34f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
34f70 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
34f80 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
34f90 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
34fa0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
34fb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68  ssert( pPager->h
34fc0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
34fd0 3d 3d 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ==1 );..#ifndef 
34fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
34ff0 55 52 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74  URRENT.  /* If t
35000 68 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52  his is an CONCUR
35010 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e  RENT transaction
35020 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
35030 69 6e 67 20 72 65 61 64 20 77 61 73 0a 20 20 2a  ing read was.  *
35040 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  * present in the
35050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
35060 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
35070 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2c 0a  ion was opened,.
35080 20 20 2a 2a 20 6d 61 72 6b 20 69 74 20 61 73 20    ** mark it as 
35090 72 65 61 64 20 69 6e 20 74 68 65 20 70 41 6c 6c  read in the pAll
350a0 52 65 61 64 20 76 65 63 74 6f 72 2e 20 20 2a 2f  Read vector.  */
350b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
350c0 41 6c 6c 52 65 61 64 20 26 26 20 70 67 6e 6f 3c  AllRead && pgno<
350d0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
350e0 69 7a 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ize ){.    rc = 
350f0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
35100 28 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61  (pPager->pAllRea
35110 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  d, pgno);.    if
35120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35130 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
35140 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 23 65  uire_err;.  }.#e
35150 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 67 6e 6f  ndif..  if( pgno
35160 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
35170 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35180 3b 0a 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69  ;.  pBase = sqli
35190 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
351a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
351b0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 69 66 28 20  pgno, 3);.  if( 
351c0 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pBase==0 ){.    
351d0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  pPg = 0;.    rc 
351e0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
351f0 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65  etchStress(pPage
35200 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
35210 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 69  , &pBase);.    i
35220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35230 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
35240 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 69  quire_err;.    i
35250 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20  f( pBase==0 ){. 
35260 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35270 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
35280 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
35290 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
352a0 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 2a 70 70  .  }.  pPg = *pp
352b0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Page = sqlite3Pc
352c0 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
352d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
352e0 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20   pgno, pBase);. 
352f0 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a   assert( pPg==(*
35300 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  ppPage) );.  ass
35310 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
35320 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
35330 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
35340 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50  Pager || pPg->pP
35350 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 6e 6f  ager==0 );..  no
35360 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73  Content = (flags
35370 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   & PAGER_GET_NOC
35380 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a 20 20 69 66  ONTENT)!=0;.  if
35390 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26  ( pPg->pPager &&
353a0 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
353b0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
353c0 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
353d0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
353e0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
353f0 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
35400 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
35410 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
35420 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
35430 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
35440 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
35450 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
35460 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
35470 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
35480 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20  R_STAT_HIT]++;. 
35490 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
354a0 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
354b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
354c0 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
354d0 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
354e0 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
354f0 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
35500 69 74 69 61 6c 69 7a 65 64 2e 20 42 75 74 20 66  itialized. But f
35510 69 72 73 74 20 73 6f 6d 65 20 65 72 72 6f 72 20  irst some error 
35520 63 68 65 63 6b 73 3a 0a 20 20 20 20 2a 2a 0a 20  checks:.    **. 
35530 20 20 20 2a 2a 20 28 31 29 20 54 68 65 20 6d 61     ** (1) The ma
35540 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
35550 72 20 69 73 20 32 5e 33 31 0a 20 20 20 20 2a 2a  r is 2^31.    **
35560 20 28 32 29 20 4e 65 76 65 72 20 74 72 79 20 74   (2) Never try t
35570 6f 20 66 65 74 63 68 20 74 68 65 20 6c 6f 63 6b  o fetch the lock
35580 69 6e 67 20 70 61 67 65 0a 20 20 20 20 2a 2f 0a  ing page.    */.
35590 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
355a0 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
355b0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
355c0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
355d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
355e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
355f0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
35600 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
35610 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  }..    pPg->pPag
35620 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
35630 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
35640 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
35650 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 69   !MEMDB );.    i
35660 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
35670 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
35680 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
35690 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
356a0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
356b0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
356c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
356d0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
356e0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
356f0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
35700 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
35710 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
35720 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
35730 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
35740 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
35750 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
35760 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
35770 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
35780 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
35790 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
357a0 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
357b0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
357c0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
357d0 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
357e0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
357f0 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
35800 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
35810 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
35820 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
35830 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
35840 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
35850 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
35860 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
35870 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
35880 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
35890 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
358a0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
358b0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
358c0 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
358d0 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
358e0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
358f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
35900 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
35910 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
35920 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
35930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35940 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
35950 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
35960 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
35970 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
35980 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
35990 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
359a0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
359b0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
359c0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
359d0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
359e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
359f0 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
35a00 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
35a10 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
35a20 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
35a30 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20       u32 iFrame 
35a40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
35a50 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
35a60 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
35a70 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ile */.      if(
35a80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
35a90 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
35aa0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
35ab0 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
35ac0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
35ad0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
35ae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35af0 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
35b00 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
35b10 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
35b20 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
35b30 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
35b40 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
35b50 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
35b60 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
35b70 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
35b80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
35b90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35ba0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
35bb0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35bc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35bd0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
35be0 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ash(pPg);.  }.  
35bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35c00 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
35c10 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
35c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
35c30 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
35c40 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
35c50 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
35c60 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
35c70 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2a  sed(pPager);.  *
35c80 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
35c90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
35ca0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
35cb0 53 49 5a 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61  SIZE>0./* The pa
35cc0 67 65 20 67 65 74 74 65 72 20 66 6f 72 20 77 68  ge getter for wh
35cd0 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  en memory-mapped
35ce0 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 20   I/O is enabled 
35cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
35d00 74 50 61 67 65 4d 4d 61 70 28 0a 20 20 50 61 67  tPageMMap(.  Pag
35d10 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
35d20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
35d30 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
35d40 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
35d50 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
35d60 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
35d70 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
35d80 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
35d90 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
35da0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
35db0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
35dc0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
35dd0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
35de0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
35df0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35e00 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ;.  PgHdr *pPg =
35e10 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65   0;.  u32 iFrame
35e20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
35e30 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74        /* Frame t
35e40 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20  o read from WAL 
35e50 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74  file */..  /* It
35e60 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
35e70 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
35e80 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
35e90 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
35ea0 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
35eb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
35ec0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
35ed0 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
35ee0 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
35ef0 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
35f00 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
35f10 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
35f20 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
35f30 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
35f40 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
35f50 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
35f60 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
35f70 20 3d 20 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26   = (pgno>1.   &&
35f80 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
35f90 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
35fa0 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
35fb0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  _GET_READONLY)).
35fc0 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
35fd0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
35fe0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
35ff0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 61 73  E_HAS_CODEC.  as
36000 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 78 43  sert( pPager->xC
36010 6f 64 65 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  odec==0 );.#endi
36020 66 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61  f..  /* Optimiza
36030 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69  tion note:  Addi
36040 6e 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22  ng the "pgno<=1"
36050 20 74 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67   term before "pg
36060 6e 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a  no==0" here.  **
36070 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70   allows the comp
36080 69 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74  iler optimizer t
36090 6f 20 72 65 75 73 65 20 74 68 65 20 72 65 73 75  o reuse the resu
360a0 6c 74 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f  lts of the "pgno
360b0 3e 31 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e  >1".  ** test in
360c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74   the previous st
360d0 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f  atement, and avo
360e0 69 64 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d  id testing pgno=
360f0 3d 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63  =0 in the.  ** c
36100 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
36110 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20   pgno is large. 
36120 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31  */.  if( pgno<=1
36130 20 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20   && pgno==0 ){. 
36140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36150 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
36160 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
36170 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
36180 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
36190 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
361a0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
361b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
361c0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
361d0 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  aredLock==1 );. 
361e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
361f0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
36200 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d  _OK );..  if( bM
36210 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73  mapOk && pagerUs
36220 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
36230 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36240 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
36250 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
36260 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69   &iFrame);.    i
36270 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36280 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
36290 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
362a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
362b0 7d 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20  }.  if( bMmapOk 
362c0 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a  && iFrame==0 ){.
362d0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
362e0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
362f0 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61  lite3OsFetch(pPa
36300 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20  ger->fd, .      
36310 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20    (i64)(pgno-1) 
36320 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
36330 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ze, pPager->page
36340 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20  Size, &pData.   
36350 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
36360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
36370 74 61 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ta ){.      if( 
36380 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
36390 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 70  AGER_READER || p
363a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
363b0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d  ){.        pPg =
363c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
363d0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
363e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
363f0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
36400 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
36410 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
36420 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44  pPager, pgno, pD
36430 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ata, &pPg);.    
36440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36450 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
36460 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
36470 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
36480 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
36490 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
364a0 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
364b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
364c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
364d0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
364e0 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65   pPg;.        re
364f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  _OK ){.      *pp
36530 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
36540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36550 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65  .  }.  return ge
36560 74 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67  tPageNormal(pPag
36570 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
36580 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64  , flags);.}.#end
36590 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
365a0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
365b0 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  ./* The page get
365c0 74 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77  ter method for w
365d0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
365e0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
365f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
36600 74 50 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61  tPageError(.  Pa
36610 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
36620 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
36630 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
36640 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
36650 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
36660 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36670 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
36680 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
36690 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
366a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
366b0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
366c0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
366d0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
366e0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55   flags */.){.  U
366f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36700 70 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pgno);.  UNUSED_
36710 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
36720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36730 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
36740 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50  ITE_OK );.  *ppP
36750 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
36760 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
36770 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74  e;.}.../* Dispat
36780 63 68 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63  ch all page fetc
36790 68 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68  h requests to th
367a0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 67 65  e appropriate ge
367b0 74 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  tter method..*/.
367c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
367d0 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Get(.  Pager *pP
367e0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
367f0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
36800 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36810 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
36820 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
36830 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
36840 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
36850 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
36860 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
36870 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
36880 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
36890 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
368a0 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
368b0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  */.){.  return p
368c0 50 61 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67  Pager->xGet(pPag
368d0 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
368e0 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
368f0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
36900 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
36910 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
36920 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
36930 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
36940 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
36950 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
36960 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
36970 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
36980 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
36990 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
369a0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
369b0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
369c0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
369d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
369e0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
369f0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
36a00 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
36a10 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
36a20 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
36a30 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
36a40 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
36a50 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
36a60 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
36a70 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
36a80 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
36a90 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
36aa0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
36ab0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
36ac0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
36ad0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
36ae0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
36af0 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70  no){.  sqlite3_p
36b00 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67  cache_page *pPag
36b10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
36b20 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
36b30 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
36b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36b50 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
36b60 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   pPage = sqlite3
36b70 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
36b80 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
36b90 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
36ba0 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61   pPage==0 || pPa
36bb0 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
36bc0 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20  edLock );.  if( 
36bd0 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  pPage==0 ) retur
36be0 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  n 0;.  return sq
36bf0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
36c00 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
36c10 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50  PCache, pgno, pP
36c20 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  age);.}../*.** R
36c30 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
36c40 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
36c50 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
36c60 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
36c70 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
36c80 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
36c90 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
36ca0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
36cb0 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
36cc0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
36cd0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
36ce0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
36cf0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
36d00 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36d10 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
36d20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
36d30 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
36d40 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  l(DbPage *pPg){.
36d50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
36d60 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d  .  assert( pPg!=
36d70 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  0 );.  pPager = 
36d80 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
36d90 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  f( pPg->flags & 
36da0 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20  PGHDR_MMAP ){.  
36db0 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
36dc0 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  pPage(pPg);.  }e
36dd0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
36de0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
36df0 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
36e00 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
36e10 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  ager);.}.void sq
36e20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
36e30 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
36e40 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65  if( pPg ) sqlite
36e50 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
36e60 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll(pPg);.}../*.*
36e70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
36e80 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
36e90 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
36ea0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
36eb0 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
36ec0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
36ed0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
36ee0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
36ef0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
36f00 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
36f10 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
36f20 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
36f30 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
36f40 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
36f50 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
36f60 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
36f70 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
36f80 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
36f90 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
36fa0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
36fb0 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
36fc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36fd0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
36fe0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36ff0 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
37000 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
37010 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
37020 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
37030 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
37040 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
37050 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
37060 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
37070 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
37080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
37090 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
370a0 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
370b0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
370c0 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
370d0 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
370e0 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
370f0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
37100 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
37110 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
37120 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
37130 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
37140 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
37150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
37160 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
37170 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
37180 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
37190 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
371a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
371b0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
371c0 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
371d0 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
371e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
371f0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
37200 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
37210 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
37220 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
37230 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
37240 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
37250 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
37260 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
37270 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
37280 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
37290 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
372a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
372b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
372d0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
372e0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
372f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
37300 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
37310 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
37320 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
37330 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37340 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37350 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
37360 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37370 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37380 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37390 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
373a0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
373b0 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
373c0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
373d0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
373e0 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
373f0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
37400 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
37410 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
37420 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
37430 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
37440 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
37450 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
37460 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
37470 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37480 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
37490 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
374a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
374b0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
374c0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
374d0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
374e0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
374f0 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
37500 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
37510 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
37520 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
37530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37540 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
37550 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
37560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37570 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
37580 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
37590 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
375a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
375b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
375c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
375d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
375e0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
375f0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
37600 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
37610 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
37620 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
37630 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
37640 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
37650 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
37660 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  ;.        int nS
37670 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69  pill;..        i
37680 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
37690 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ile ){.         
376a0 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
376b0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
376c0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
376d0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _TEMP_JOURNAL);.
376e0 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
376f0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
37700 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20  .nStmtSpill;.   
37710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37720 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
37730 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
37740 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
37750 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c     nSpill = jrnl
37760 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
37770 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
37780 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
37790 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
377a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
377b0 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
377c0 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
377d0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
377e0 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
377f0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
37800 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
37810 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
37820 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
37830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37840 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37850 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
37860 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20 20  en (.           
37870 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
37880 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
37890 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  r->jfd, flags, n
378a0 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  Spill.          
378b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
378c0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
378d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
378e0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
378f0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d  r->jfd) );.    }
37900 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72  .  .  .    /* Wr
37910 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
37920 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
37930 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37940 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a   and open .    *
37950 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
37960 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
37970 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
37980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37990 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43        /* TODO: C
379a0 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
379b0 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
379c0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
379d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
379e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
379f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
37a00 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
37a10 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
37a20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
37a30 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
37a40 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
37a50 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
37a60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
37a70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37a80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
37a90 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
37aa0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
37ab0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
37ac0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
37ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
37ae0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37af0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37b00 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50  LOCKED );.    pP
37b10 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
37b20 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
37b30 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  EMOD;.  }..  ret
37b40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37b50 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
37b60 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
37b70 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
37b80 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
37b90 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
37ba0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
37bb0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
37bc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
37bd0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
37be0 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
37bf0 6d 65 6e 74 20 69 73 20 30 2c 20 74 68 65 6e 20  ment is 0, then 
37c00 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
37c10 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
37c20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
37c30 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
37c40 6c 61 67 20 69 73 20 3e 30 2c 20 74 68 65 6e 20  lag is >0, then 
37c50 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
37c60 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
37c70 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
37c80 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
37c90 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
37ca0 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
37cb0 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
37cc0 2a 2a 0a 2a 2a 20 49 66 20 28 65 78 46 6c 61 67  **.** If (exFlag
37cd0 3c 30 29 20 61 6e 64 20 74 68 65 20 64 61 74 61  <0) and the data
37ce0 62 61 73 65 20 69 73 20 69 6e 20 57 41 4c 20 6d  base is in WAL m
37cf0 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 74 61 6b 65  ode, do not take
37d00 20 61 6e 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54   any locks..** T
37d10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
37d20 69 6c 6c 20 72 75 6e 20 69 6e 20 43 4f 4e 43 55  ill run in CONCU
37d30 52 52 45 4e 54 20 6d 6f 64 65 20 69 6e 73 74 65  RRENT mode inste
37d40 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ad..**.** If the
37d50 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
37d60 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
37d70 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
37d80 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
37d90 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
37da0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
37db0 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
37dc0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
37dd0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
37de0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
37df0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
37e00 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
37e10 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
37e20 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
37e30 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
37e40 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
37e50 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
37e60 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
37e70 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
37e80 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
37e90 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
37ea0 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
37eb0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
37ec0 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
37ed0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
37ee0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
37ef0 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
37f00 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
37f10 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
37f20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37f30 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
37f40 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
37f50 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
37f60 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
37f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
37f80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
37f90 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
37fa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37fb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37fc0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
37fd0 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
37fe0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
37ff0 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
38000 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
38010 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
38020 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
38030 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
38040 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
38050 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
38060 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
38070 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
38080 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
38090 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
380a0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
380b0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
380c0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
380d0 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
380e0 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
380f0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
38100 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
38110 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
38120 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
38130 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
38140 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
38150 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
38160 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
38170 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
38180 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
38190 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
381a0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
381b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
381c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
381d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
381e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
381f0 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64   }.        (void
38200 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75  )sqlite3WalExclu
38210 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
38220 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
38230 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
38240 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
38250 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
38260 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
38270 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
38280 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
38290 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
382a0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
382b0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
382c0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
382d0 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
382e0 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
382f0 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
38300 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
38310 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
38320 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
38330 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
38340 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
38350 6c 20 63 61 6c 6c 20 69 74 2e 20 20 2a 2f 0a 20  l call it.  */. 
38360 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 3e       if( exFlag>
38370 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
38380 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
38390 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
383a0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
383b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
383c0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
383d0 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
383e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
383f0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
38400 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
38410 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
38420 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
38430 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
38440 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
38450 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
38460 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
38470 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
38480 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
38490 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
384a0 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
384b0 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
384c0 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
384d0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
384e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
384f0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
38500 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
38510 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
38520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38530 20 26 26 20 65 78 46 6c 61 67 3e 30 20 29 7b 0a   && exFlag>0 ){.
38540 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
38550 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
38560 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
38570 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
38580 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
38590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
385a0 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
385b0 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
385c0 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
385d0 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
385e0 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
385f0 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
38600 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
38610 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
38620 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
38630 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
38640 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
38650 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
38660 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
38670 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
38680 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
38690 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
386a0 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
386b0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
386c0 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
386d0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
386e0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
386f0 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
38700 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
38710 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
38720 63 61 63