/ Hex Artifact Content
Login

Artifact 079884c8486596240e200f1e37e867b1ed56eff399e4bbbcabcc145dc5679cd5:


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 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
29130 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
29140 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
29150 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
29160 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
29170 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
29180 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
29190 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
291a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
291b0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
291c0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
291d0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
291e0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
291f0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
29200 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
29210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
29220 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
29230 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
29240 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
29250 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
29260 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
29270 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
29280 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
29290 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
292a0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
292b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
292c0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
292d0 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
292e0 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
292f0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
29300 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
29310 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
29320 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
29330 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
29340 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
29350 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
29360 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
29370 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
29380 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
29390 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
293a0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
293b0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
293c0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
293d0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
293e0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
293f0 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
29400 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
29410 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
29420 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
29430 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
29440 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
29450 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
29460 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
29470 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
29480 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
29490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
294a0 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
294b0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
294c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
294d0 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
294e0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
294f0 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
29500 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
29510 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
29520 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
29530 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
29540 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
29550 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
29560 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
29570 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
29580 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
29590 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
295a0 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
295b0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
295c0 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
295d0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
295e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
295f0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
29600 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
29610 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
29620 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
29630 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
29640 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
29650 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
29660 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
29670 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
29680 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
29690 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
296a0 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
296b0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
296c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
296d0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
296e0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
296f0 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
29700 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
29710 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
29720 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
29730 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
29740 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
29750 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
29760 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
29770 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
29780 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
29790 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
297a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
297b0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
297c0 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
297d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
297e0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
297f0 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
29800 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
29810 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
29820 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
29830 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
29840 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
29850 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
29860 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
29870 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
29880 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
29890 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
298a0 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
298b0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
298c0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
298d0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
298e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
298f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29900 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
29910 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
29920 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
29930 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
29940 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
29950 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
29960 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
29970 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
29980 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
29990 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
299a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
299b0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
299c0 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
299d0 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
299e0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
299f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29a00 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
29a10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
29a20 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
29a30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29a40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
29a50 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
29a60 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
29a70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
29a80 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
29a90 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
29aa0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
29ab0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
29ac0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
29ad0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
29ae0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
29af0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
29b00 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
29b10 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
29b20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
29b30 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
29b40 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
29b50 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
29b60 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
29b70 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
29b80 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
29b90 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
29ba0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
29bb0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
29bc0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
29bd0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
29be0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
29bf0 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
29c00 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
29c10 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
29c20 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
29c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
29c40 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
29c50 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
29c60 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
29c70 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
29c80 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
29c90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
29ca0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
29cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
29cc0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
29cd0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
29ce0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
29cf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
29d00 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
29d10 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
29d20 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29d30 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
29d40 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
29d50 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
29d60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
29d70 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
29d80 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
29d90 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
29da0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29db0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29dc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
29dd0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
29de0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
29df0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
29e00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
29e10 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
29e20 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
29e30 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
29e40 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
29e50 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
29e60 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
29e70 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
29e80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29e90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29ea0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29eb0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
29ec0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
29ed0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
29ee0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
29ef0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
29f00 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
29f10 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
29f20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
29f30 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
29f40 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
29f50 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
29f60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
29f70 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
29f80 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
29f90 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
29fa0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
29fb0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
29fc0 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
29fd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29ff0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2a000 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
2a010 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
2a020 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
2a030 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
2a040 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
2a050 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
2a060 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
2a070 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
2a080 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2a090 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
2a0a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2a0b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a0c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2a0d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2a0e0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
2a0f0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
2a100 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2a110 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
2a120 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
2a130 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
2a140 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
2a150 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
2a160 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
2a170 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
2a180 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
2a190 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
2a1a0 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
2a1b0 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
2a1c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
2a1d0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
2a1e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2a1f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2a200 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
2a210 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
2a220 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2a230 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2a240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a250 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
2a260 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2a270 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
2a280 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
2a290 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
2a2a0 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
2a2b0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
2a2c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
2a2d0 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
2a2e0 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
2a2f0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
2a300 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
2a310 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
2a320 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
2a330 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
2a340 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
2a350 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
2a360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2a370 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
2a380 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
2a390 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
2a3a0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2a3b0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2a3c0 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
2a3d0 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
2a3e0 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
2a3f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
2a400 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
2a410 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
2a420 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
2a430 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
2a440 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
2a450 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
2a460 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
2a470 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
2a480 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2a490 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
2a4a0 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
2a4b0 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
2a4c0 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
2a4d0 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
2a4e0 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
2a4f0 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
2a500 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
2a510 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
2a520 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
2a530 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
2a540 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
2a550 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
2a560 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
2a570 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
2a580 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
2a590 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
2a5a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
2a5b0 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
2a5c0 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
2a5d0 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
2a5e0 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
2a5f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2a600 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
2a610 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
2a620 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2a630 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
2a640 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
2a650 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
2a660 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
2a670 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
2a680 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
2a690 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
2a6a0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2a6b0 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
2a6c0 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
2a6d0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
2a6e0 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
2a6f0 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
2a700 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
2a710 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
2a720 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
2a730 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
2a740 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
2a750 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
2a760 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2a770 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
2a780 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
2a790 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2a7a0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2a7b0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
2a7c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2a7d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
2a7e0 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
2a7f0 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
2a800 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
2a810 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2a820 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2a830 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
2a840 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
2a850 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
2a860 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
2a870 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a890 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a8a0 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
2a8b0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
2a8c0 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
2a8d0 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
2a8e0 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
2a8f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
2a900 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a910 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2a920 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2a930 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2a940 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2a950 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
2a960 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
2a970 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
2a980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2a990 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2a9a0 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74   || pList->pDirt
2a9b0 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
2a9c0 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
2a9d0 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
2a9e0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2a9f0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
2aa00 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
2aa10 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
2aa20 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
2aa30 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
2aa40 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
2aa50 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
2aa60 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
2aa70 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
2aa80 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
2aa90 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2aaa0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
2aab0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2aac0 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
2aad0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2aae0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
2aaf0 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
2ab00 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
2ab10 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
2ab20 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
2ab30 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
2ab40 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
2ab50 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
2ab60 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
2ab70 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
2ab80 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2ab90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2aba0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2abb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2abc0 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67  E_OK .   && pPag
2abd0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70  er->dbHintSize<p
2abe0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20  Pager->dbSize.  
2abf0 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72   && (pList->pDir
2ac00 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e  ty || pList->pgn
2ac10 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  o>pPager->dbHint
2ac20 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73  Size).  ){.    s
2ac30 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
2ac40 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
2ac50 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
2ac60 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
2ac70 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
2ac80 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
2ac90 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
2aca0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
2acb0 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65  ZE_HINT, &szFile
2acc0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2acd0 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
2ace0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
2acf0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
2ad00 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2ad10 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2ad20 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
2ad30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2ad40 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
2ad50 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
2ad60 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
2ad70 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
2ad80 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
2ad90 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
2ada0 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
2adb0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
2adc0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
2add0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
2ade0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
2adf0 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
2ae00 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
2ae10 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
2ae20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
2ae30 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
2ae40 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
2ae50 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
2ae60 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
2ae70 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
2ae80 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
2ae90 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
2aea0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2aeb0 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
2aec0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
2aed0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2aee0 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
2aef0 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
2af00 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
2af10 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
2af20 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
2af30 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
2af40 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
2af50 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
2af60 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
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 2f 2a 20 44 61 74 61 20 74         /* Data t
2af90 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
2afa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2afb0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
2afc0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2afd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
2afe0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
2aff0 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
2b000 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
2b010 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
2b020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2b030 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
2b040 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
2b050 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
2b060 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b070 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a  _BKPT, pData);..
2b080 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
2b090 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
2b0a0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2b0b0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2b0c0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
2b0d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2b0e0 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
2b0f0 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
2b100 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
2b110 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
2b120 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
2b130 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
2b140 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
2b150 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2b160 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
2b170 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
2b180 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
2b190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b1a0 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
2b1b0 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
2b1c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2b1d0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
2b1e0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2b1f0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
2b200 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
2b210 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
2b220 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2b230 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
2b240 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2b250 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
2b260 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2b270 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
2b280 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
2b290 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
2b2a0 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20  RITE]++;..      
2b2b0 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
2b2c0 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
2b2d0 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
2b2e0 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
2b2f0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2b300 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
2b310 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
2b320 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
2b330 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
2b340 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
2b350 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
2b360 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b380 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2b390 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
2b3a0 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
2b3b0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2b3c0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
2b3d0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2b3e0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
2b3f0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
2b400 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
2b410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b420 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
2b430 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
2b440 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2b450 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
2b460 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
2b470 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
2b480 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
2b490 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
2b4a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2b4b0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
2b4c0 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
2b4d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
2b4e0 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
2b4f0 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
2b500 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
2b510 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
2b520 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2b530 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
2b540 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
2b550 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
2b560 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
2b570 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2b580 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
2b590 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
2b5a0 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
2b5b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
2b5c0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
2b5d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2b5e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b5f0 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
2b600 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2b610 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
2b620 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f  flags =  SQLITE_
2b630 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
2b640 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
2b650 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c  ADWRITE .      |
2b660 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
2b670 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
2b680 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  N_EXCLUSIVE .   
2b690 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
2b6a0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
2b6b0 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69      int nStmtSpi
2b6c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66  ll = sqlite3Conf
2b6d0 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20  ig.nStmtSpill;. 
2b6e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2b6f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2b700 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2b710 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
2b720 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2b730 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c        nStmtSpill
2b740 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2b750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
2b760 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2b770 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72  >pVfs, 0, pPager
2b780 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  ->sjfd, flags, n
2b790 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a  StmtSpill);.  }.
2b7a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b7b0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
2b7c0 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
2b7d0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
2b7e0 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
2b7f0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a  b-journal. .**.*
2b800 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2b810 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2b820 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2b830 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2b840 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2b850 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2b860 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2b870 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2b880 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2b890 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2b8a0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2b8b0 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2b8c0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2b8d0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2b8e0 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2b8f0 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2b900 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2b910 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2b920 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2b930 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2b940 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2b950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2b960 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2b970 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2b980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b990 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2b9a0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2b9b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b9c0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2b9d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2b9e0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2b9f0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ba00 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2ba10 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2ba20 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2ba30 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2ba40 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2ba50 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2ba60 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2ba70 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2ba80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2ba90 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2baa0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2bab0 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2bac0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2bad0 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2bae0 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2baf0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2bb00 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2bb10 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2bb20 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2bb30 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2bb40 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2bb50 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2bb60 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2bb70 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2bb80 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2bb90 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2bba0 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2bbb0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2bbc0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2bbd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2bbe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bbf0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2bc00 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2bc10 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2bc20 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2bc30 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2bc40 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2bc50 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2bc60 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
2bc70 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20 69  CODEC   .      i
2bc80 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a  f( !pPager->subj
2bc90 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
2bca0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2bcb0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2bcc0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2bcd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2bce0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2bcf0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2bd00 20 20 20 20 70 44 61 74 61 32 20 3d 20 70 44 61      pData2 = pDa
2bd10 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  ta;.      PAGERT
2bd20 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
2bd30 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
2bd40 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2bd50 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2bd60 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
2bd70 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
2bd80 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
2bd90 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
2bda0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bdb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2bdc0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2bdd0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
2bde0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
2bdf0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
2be00 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
2be10 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
2be20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2be30 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2be40 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
2be50 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2be60 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
2be70 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
2be80 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
2be90 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
2bea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2beb0 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
2bec0 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2bed0 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  d(PgHdr *pPg){. 
2bee0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2bef0 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
2bf00 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72    return subjour
2bf10 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
2bf20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2bf30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2bf40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2bf50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2bf60 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
2bf70 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
2bf80 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
2bf90 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
2bfa0 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
2bfb0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
2bfc0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
2bfd0 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
2bfe0 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
2bff0 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
2c000 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
2c010 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
2c020 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
2c030 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2c040 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2c050 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
2c060 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
2c070 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
2c080 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2c090 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
2c0a0 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
2c0b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c0c0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
2c0d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2c0e0 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
2c0f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
2c100 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2c110 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
2c120 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
2c130 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
2c140 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2c150 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
2c160 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
2c170 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
2c180 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2c190 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
2c1a0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
2c1b0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2c1c0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
2c1d0 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
2c1e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2c1f0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2c200 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2c210 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
2c220 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
2c230 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
2c240 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2c250 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
2c260 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
2c270 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
2c280 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
2c290 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
2c2a0 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2c2b0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2c2c0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
2c2d0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2c2e0 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
2c2f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
2c300 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
2c310 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2c320 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
2c330 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
2c340 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c350 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2c360 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2c370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
2c380 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2c390 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
2c3a0 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e  doNotSpill NOSYN
2c3b0 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72  C bit is set dur
2c3c0 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
2c3d0 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
2c3e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
2c3f0 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
2c400 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
2c410 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
2c420 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
2c430 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
2c440 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
2c450 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
2c460 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
2c470 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
2c480 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
2c490 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
2c4a0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52  The doNotSpill R
2c4b0 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20  OLLBACK and OFF 
2c4c0 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c  bits inhibits al
2c4d0 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
2c4e0 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73  .  ** regardless
2c4f0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
2c500 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
2c510 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
2c520 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  set during.  ** 
2c530 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79  a rollback or by
2c540 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72   user request, r
2c550 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
2c560 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20  *.  ** Spilling 
2c570 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74  is also prohibit
2c580 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72  ed when in an er
2c590 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20  ror state since 
2c5a0 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20  that could.  ** 
2c5b0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
2c5c0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49   corruption.   I
2c5d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
2c5e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20  plementation it 
2c5f0 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69  .  ** is impossi
2c600 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50  ble for sqlite3P
2c610 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20  cacheFetch() to 
2c620 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63  be called with c
2c630 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a  reateFlag==3.  *
2c640 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65  * while in the e
2c650 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63  rror state, henc
2c660 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  e it is impossib
2c670 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
2c680 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63  ine to.  ** be c
2c690 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72  alled in the err
2c6a0 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72  or state.  Never
2c6b0 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c  theless, we incl
2c6c0 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20  ude a NEVER().  
2c6d0 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  ** test for the 
2c6e0 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61  error state as a
2c6f0 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e   safeguard again
2c700 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  st future change
2c710 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
2c720 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2c730 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ode) ) return SQ
2c740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63  LITE_OK;.  testc
2c750 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2c760 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2c770 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  LAG_ROLLBACK );.
2c780 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2c790 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2c7a0 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29   SPILLFLAG_OFF )
2c7b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2c7c0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2c7d0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53   & SPILLFLAG_NOS
2c7e0 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61  YNC );.  if( pPa
2c7f0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a  ger->doNotSpill.
2c800 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e     && ((pPager->
2c810 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50  doNotSpill & (SP
2c820 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2c830 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29  |SPILLFLAG_OFF))
2c840 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  !=0.      || (pP
2c850 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
2c860 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a  _NEED_SYNC)!=0).
2c870 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2c880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2c890 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
2c8a0 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
2c8b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
2c8c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c8d0 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
2c8e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 61     /* If the tra
2c8f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 22 42  nsaction is a "B
2c900 45 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 22  EGIN CONCURRENT"
2c910 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2c920 65 20 70 61 67 65 20 0a 20 20 20 20 2a 2a 20 63  e page .    ** c
2c930 61 6e 6e 6f 74 20 62 65 20 66 6c 75 73 68 65 64  annot be flushed
2c940 20 74 6f 20 64 69 73 6b 2e 20 52 65 74 75 72 6e   to disk. Return
2c950 20 65 61 72 6c 79 20 69 6e 20 74 68 69 73 20 63   early in this c
2c960 61 73 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ase. */.    if( 
2c970 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
2c980 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c990 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  _OK;.#endif..   
2c9a0 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2c9b0 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2c9c0 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2c9d0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2c9e0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
2c9f0 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20  equired(pPg); . 
2ca00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ca10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2ca20 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2ca30 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2ca40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2ca50 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
2ca60 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2ca70 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2ca80 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2ca90 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2caa0 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2cab0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2cac0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2cad0 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2cae0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2caf0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2cb00 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2cb10 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
2cb20 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2cb30 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2cb40 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
2cb50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cb60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2cb70 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
2cb80 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2cb90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
2cba0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
2cbb0 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
2cbc0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
2cbd0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
2cbe0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
2cbf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cc00 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
2cc10 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
2cc20 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2cc30 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2cc40 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2cc50 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2cc60 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
2cc70 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
2cc80 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2cc90 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  c); .}../*.** Fl
2cca0 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ush all unrefere
2ccb0 6e 63 65 64 20 64 69 72 74 79 20 70 61 67 65 73  nced dirty pages
2ccc0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
2ccd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75   sqlite3PagerFlu
2cce0 73 68 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  sh(Pager *pPager
2ccf0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
2cd00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2cd10 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
2cd20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
2cd30 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
2cd40 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
2cd50 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61  >pPCache);.    a
2cd60 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
2cd70 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
2cd80 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) );.    while( 
2cd90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2cda0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
2cdb0 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
2cdc0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2cdd0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
2cde0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
2cdf0 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 72 65    rc = pagerStre
2ce00 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72  ss((void*)pPager
2ce10 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
2ce20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  }.      pList = 
2ce30 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
2ce40 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2ce50 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2ce60 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2ce70 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
2ce80 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
2ce90 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
2cea0 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
2ceb0 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
2cec0 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
2ced0 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
2cee0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2cef0 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
2cf00 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
2cf10 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
2cf20 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
2cf30 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
2cf40 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
2cf50 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
2cf60 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
2cf70 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2cf80 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
2cf90 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
2cfa0 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
2cfb0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
2cfc0 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
2cfd0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
2cfe0 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
2cff0 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
2d000 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
2d010 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
2d020 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
2d030 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
2d040 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
2d050 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
2d060 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
2d070 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
2d080 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
2d090 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
2d0a0 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
2d0b0 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
2d0c0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2d0d0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
2d0e0 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
2d0f0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
2d100 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
2d110 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2d120 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
2d130 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2d140 72 61 28 29 20 41 50 49 2e 20 20 57 68 65 6e 20  ra() API.  When 
2d150 61 20 6e 65 77 20 70 61 67 65 20 69 73 20 61 6c  a new page is al
2d160 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a 2a 2a 20  located, the.** 
2d170 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
2d180 20 74 68 69 73 20 73 70 61 63 65 20 61 72 65 20   this space are 
2d190 7a 65 72 6f 65 64 20 62 75 74 20 74 68 65 20 72  zeroed but the r
2d1a0 65 6d 61 69 6e 64 65 72 20 69 73 20 75 6e 69 6e  emainder is unin
2d1b0 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54  itialized..** (T
2d1c0 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20 69  he extra space i
2d1d0 73 20 75 73 65 64 20 62 79 20 62 74 72 65 65 20  s used by btree 
2d1e0 61 73 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  as the MemPage o
2d1f0 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  bject.).**.** Th
2d200 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
2d210 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63   is used to spec
2d220 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74  ify properties t
2d230 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a  hat affect the.*
2d240 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  * operation of t
2d250 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f  he pager. It sho
2d260 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f  uld be passed so
2d270 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69  me bitwise combi
2d280 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  nation.** of the
2d290 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a   PAGER_* flags..
2d2a0 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
2d2b0 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
2d2c0 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
2d2d0 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
2d2e0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
2d2f0 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
2d300 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
2d310 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
2d320 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
2d330 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
2d340 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
2d350 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
2d360 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
2d370 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
2d380 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2d390 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
2d3a0 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
2d3b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
2d3c0 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
2d3d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2d3e0 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
2d3f0 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
2d400 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
2d410 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
2d420 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2d430 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
2d440 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
2d450 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
2d460 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
2d470 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
2d480 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
2d490 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
2d4a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d4b0 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
2d4c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2d4d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
2d4e0 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
2d4f0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
2d500 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
2d510 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
2d520 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
2d530 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2d540 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d550 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
2d560 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2d570 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2d580 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2d590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d5a0 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
2d5b0 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
2d5c0 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2d5d0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2d5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2d5f0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
2d600 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
2d610 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
2d620 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2d630 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
2d640 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
2d650 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
2d660 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
2d670 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
2d680 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
2d690 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
2d6a0 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
2d6b0 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
2d6c0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2d6d0 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
2d6e0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
2d6f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d700 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
2d710 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2d720 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
2d730 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2d740 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
2d750 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
2d760 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
2d770 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
2d780 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2d790 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2d7a0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2d7b0 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
2d7c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d7d0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
2d7e0 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
2d7f0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
2d800 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
2d810 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2d820 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
2d830 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
2d840 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
2d850 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
2d860 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2d870 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
2d880 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
2d890 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2d8a0 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
2d8b0 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
2d8c0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
2d8d0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
2d8e0 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
2d8f0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
2d900 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
2d910 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2d920 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
2d930 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2d940 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
2d950 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u32 szPageDflt =
2d960 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2d970 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
2d980 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2d990 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2d9a0 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f   *zUri = 0;    /
2d9b0 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f  * URI args to co
2d9c0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69  py */.  int nUri
2d9d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d9e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2d9f0 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20  tes of URI args 
2da00 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f  at *zUri */..  /
2da10 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2da20 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
2da30 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
2da40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2da50 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
2da60 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
2da70 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
2da80 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
2da90 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a  ournal).  */.  j
2daa0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2dab0 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2dac0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2dad0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
2dae0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2daf0 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2db00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2db10 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2db20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2db30 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2db40 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2db50 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2db60 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2db70 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
2db80 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2db90 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68  ] ){.      zPath
2dba0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2dbb0 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e  StrDup(0, zFilen
2dbc0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2dbd0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20  zPathname==0  ) 
2dbe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2dbf0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2dc00 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2dc10 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2dc20 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2dc30 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2dc40 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2dc50 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2dc60 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2dc70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2dc80 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2dc90 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2dca0 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2dcb0 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2dcc0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2dcd0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2dce0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2dcf0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2dd00 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2dd10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2dd20 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2dd30 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2dd40 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2dd50 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2dd60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2dd70 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2dd80 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2dd90 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2dda0 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2ddb0 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2ddc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ddd0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2dde0 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2ddf0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2de00 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2de10 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2de20 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2de30 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2de40 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2de50 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2de60 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2de70 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2de80 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2de90 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2dea0 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2deb0 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2dec0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ded0 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2dee0 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2def0 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2df00 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2df10 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2df20 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2df30 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2df40 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2df50 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2df60 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2df70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2df80 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2df90 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2dfa0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2dfb0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2dfc0 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2dfd0 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2dfe0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2dff0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2e000 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2e010 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2e020 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2e030 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2e040 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2e050 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2e060 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2e070 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2e080 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2e090 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2e0a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2e0b0 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2e0c0 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2e0d0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2e0e0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2e0f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e100 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2e110 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2e120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e130 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2e140 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2e150 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2e160 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2e170 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2e180 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2e190 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2e1a0 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2e1b0 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2e1c0 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2e1d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2e1e0 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2e1f0 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2e200 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2e210 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2e220 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2e230 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2e240 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2e250 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2e260 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2e270 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2e280 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2e290 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2e2a0 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2e2b0 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2e2c0 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2e2d0 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2e2e0 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2e2f0 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2e300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2e310 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2e320 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2e330 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2e340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2e350 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2e360 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2e370 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2e380 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2e3a0 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2e3b0 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2e3c0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2e3d0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2e3e0 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2e3f0 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2e400 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2e410 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2e420 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2e430 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2e440 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2e450 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2e460 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2e470 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2e480 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2e490 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2e4a0 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2e4b0 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2e4c0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2e4d0 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2e4e0 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2e4f0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2e500 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2e510 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2e520 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2e530 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2e540 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2e550 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2e560 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2e570 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2e580 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2e590 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2e5a0 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2e5b0 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2e5c0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2e5d0 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2e5e0 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2e5f0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2e600 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2e610 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2e620 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2e630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e640 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
2e650 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
2e660 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
2e670 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
2e680 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
2e690 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
2e6a0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2e6b0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
2e6c0 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
2e6d0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2e6e0 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
2e6f0 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
2e700 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
2e710 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2e720 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
2e730 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
2e740 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
2e750 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2e760 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2e770 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
2e780 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
2e790 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
2e7a0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2e7b0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2e7c0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2e7d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2e7e0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2e7f0 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
2e800 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
2e810 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
2e820 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2e830 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
2e840 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61  .    assert( nPa
2e850 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20  thname>0 );.    
2e860 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2e870 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
2e880 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
2e890 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20   1 + nUri);.    
2e8a0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2e8b0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
2e8c0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2e8d0 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20  .    if( nUri ) 
2e8e0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2e8f0 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
2e900 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55  ame+1], zUri, nU
2e910 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2e920 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2e930 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2e940 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2e950 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
2e960 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
2e970 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22  , "-journal\000"
2e980 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  , 8+2);.    sqli
2e990 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2e9a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e9b0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2e9c0 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  al);.#ifndef SQL
2e9d0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2e9e0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20   pPager->zWal = 
2e9f0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2ea00 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d  l[nPathname+8+1]
2ea10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2ea20 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68  ger->zWal, zPath
2ea30 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2ea40 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2ea50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68  ager->zWal[nPath
2ea60 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30  name], "-wal\000
2ea70 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c  ", 4+1);.    sql
2ea80 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2ea90 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2eaa0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29  e, pPager->zWal)
2eab0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2eac0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2ead0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
2eae0 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
2eaf0 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
2eb00 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
2eb10 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
2eb20 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
2eb30 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2eb40 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2eb50 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  [0] ){.    int f
2eb60 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2eb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2eb80 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2eb90 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2eba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ebb0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2ebc0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2ebd0 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2ebe0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2ebf0 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62    assert( !memDb
2ec00 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   );.    readOnly
2ec10 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2ec20 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2ec30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2ec40 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2ec50 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2ec60 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2ec70 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2ec80 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2ec90 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2eca0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2ecb0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2ecc0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2ecd0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2ece0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2ecf0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2ed00 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2ed10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2ed20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2ed30 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2ed40 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2ed50 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2ed60 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2ed70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2ed80 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2ed90 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2eda0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2edb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2edc0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2edd0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2ede0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2edf0 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
2ee00 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2ee10 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
2ee20 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2ee30 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2ee40 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2ee50 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2ee60 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2ee70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2ee80 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
2ee90 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
2eea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2eeb0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2eec0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
2eed0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
2eee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2eef0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2ef00 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2ef10 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2ef20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ef30 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2ef40 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2ef50 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2ef60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ef70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2ef80 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2ef90 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  TE.        {.   
2efa0 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
2efb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2efc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2efd0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2efe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2eff0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2f000 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2f010 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2f020 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2f030 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2f040 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2f050 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
2f060 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2f070 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2f080 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2f090 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2f0a0 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
2f0b0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2f0c0 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20  C|(ii>>8)) ){.  
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2f0e0 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2f0f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f110 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
2f120 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f        pPager->no
2f130 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75  Lock = sqlite3_u
2f140 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2f150 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20  name, "nolock", 
2f160 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  0);.      if( (i
2f170 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
2f180 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a  P_IMMUTABLE)!=0.
2f190 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2f1a0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2f1b0 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61  ilename, "immuta
2f1c0 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20  ble", 0) ){.    
2f1d0 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c        vfsFlags |
2f1e0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2f1f0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
2f200 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f    goto act_like_
2f210 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20  temp_file;.     
2f220 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
2f230 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
2f240 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2f250 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
2f260 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
2f270 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
2f280 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
2f290 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
2f2a0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
2f2b0 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
2f2c0 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
2f2d0 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
2f2e0 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
2f2f0 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
2f300 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2f310 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
2f320 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2f330 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
2f340 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
2f350 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
2f360 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
2f370 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
2f380 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
2f390 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
2f3a0 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
2f3b0 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
2f3c0 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nal..    **.    
2f3d0 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 61  ** This branch a
2f3e0 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c  lso runs for fil
2f3f0 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d  es marked as imm
2f400 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a  utable..    */ .
2f410 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69  act_like_temp_fi
2f420 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  le:.    tempFile
2f430 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2f440 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2f450 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20  _READER;     /* 
2f460 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61  Pretend we alrea
2f470 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a  dy have a lock *
2f480 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c  /.    pPager->eL
2f490 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ock = EXCLUSIVE_
2f4a0 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74  LOCK;    /* Pret
2f4b0 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45 58  end we are in EX
2f4c0 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a  CLUSIVE mode */.
2f4d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2f4e0 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ck = 1;         
2f4f0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20         /* Do no 
2f500 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72  locking */.    r
2f510 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2f520 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2f530 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2f540 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2f550 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2f560 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2f570 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2f580 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2f590 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2f5a0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2f5b0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2f5c0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2f5d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f5e0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2f5f0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2f600 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2f610 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2f620 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2f630 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2f640 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2f650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2f660 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
2f670 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
2f680 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28  object. */.  if(
2f690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f6a0 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52  {.    nExtra = R
2f6b0 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
2f6c0 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
2f6d0 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61 3c 31  a>=8 && nExtra<1
2f6e0 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  000 );.    rc = 
2f6f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2f700 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2f710 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f730 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2f740 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2f750 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2f760 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
2f770 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
2f780 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  or occurred abov
2f790 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67  e, free the  Pag
2f7a0 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2f7b0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2f7c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2f7d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f7e0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2f7f0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2f800 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
2f810 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
2f820 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
2f830 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2f840 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f850 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2f860 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
2f870 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
2f880 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
2f890 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
2f8a0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
2f8b0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
2f8c0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
2f8d0 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
2f8e0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
2f8f0 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
2f900 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2f910 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
2f920 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
2f930 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
2f940 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
2f950 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f960 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
2f970 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f980 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
2f990 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f9a0 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
2f9b0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
2f9c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
2f9d0 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
2f9e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2f9f0 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
2fa00 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2fa10 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2fa20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2fa30 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2fa40 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2fa50 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2fa60 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2fa70 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2fa80 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2fa90 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2faa0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2fab0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2fac0 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2fad0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2fae0 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2faf0 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2fb00 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2fb10 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2fb20 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2fb30 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2fb40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2fb50 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2fb60 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2fb70 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2fb80 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2fb90 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2fba0 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2fbb0 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
2fbc0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2fbd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fbe0 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
2fbf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2fc00 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d  ger->extraSync==
2fc10 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2fc20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2fc30 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2fc40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2fc50 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2fc60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2fc70 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2fc80 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2fc90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2fca0 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2fcb0 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
2fcc0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2fcd0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2fce0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2fcf0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2fd00 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2fd10 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2fd20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2fd30 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2fd40 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2fd50 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2fd60 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2fd70 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2fd80 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fd90 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2fda0 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2fdb0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2fdc0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2fdd0 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2fde0 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2fdf0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2fe00 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2fe10 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2fe20 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2fe30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2fe40 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2fe50 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2fe60 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2fe70 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2fe80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2fe90 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2fea0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2feb0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2fec0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2fed0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2fee0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2fef0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2ff00 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2ff10 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2ff20 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2ff30 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2ff40 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2ff50 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2ff60 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d  it;.  setGetterM
2ff70 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20  ethod(pPager);. 
2ff80 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2ff90 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2ffa0 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2ffb0 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  h)); */.  /* pPa
2ffc0 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51  ger->szMmap = SQ
2ffd0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41  LITE_DEFAULT_MMA
2ffe0 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62  P_SIZE // will b
2fff0 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
30000 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
30010 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
30020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30030 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
30040 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30050 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65  le has not be de
30060 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64  leted or renamed
30070 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64   out from.** und
30080 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52  er the pager.  R
30090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
300a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
300b0 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74  is still were it
300c0 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20   ought.** to be 
300d0 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  on disk.  Return
300e0 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54   non-zero (SQLIT
300f0 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
30100 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ED or some other
30110 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66   error.** code f
30120 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  rom sqlite3OsAcc
30130 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61  ess()) if the da
30140 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20  tabase has gone 
30150 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  missing..*/.stat
30160 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49  ic int databaseI
30170 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a  sUnmoved(Pager *
30180 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62  pPager){.  int b
30190 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
301a0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
301b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
301c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
301d0 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
301e0 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65  ->dbSize==0 ) re
301f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30200 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30210 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70  ->zFilename && p
30220 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
30230 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  [0] );.  rc = sq
30240 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
30250 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
30260 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
30270 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65  MOVED, &bHasMove
30280 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
30290 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
302a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48  .    /* If the H
302b0 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f  AS_MOVED file-co
302c0 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65  ntrol is unimple
302d0 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74  mented, assume t
302e0 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20  hat the file.   
302f0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
30300 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73   moved.  That is
30310 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20   the historical 
30320 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69  behavior of SQLi
30330 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  te: prior to.   
30340 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e   ** version 3.8.
30350 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63  3, it never chec
30360 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ked */.    rc = 
30370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
30380 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
30390 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65  E_OK && bHasMove
303a0 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
303b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
303c0 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  MOVED;.  }.  ret
303d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
303e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
303f0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
30400 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
30410 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
30420 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
30430 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
30440 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
30450 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
30460 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
30470 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
30480 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
30490 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
304a0 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
304b0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
304c0 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
304d0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
304e0 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
304f0 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
30500 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
30510 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
30520 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
30530 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30540 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
30550 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
30560 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
30570 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
30580 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
30590 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
305a0 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
305b0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
305c0 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
305d0 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
305e0 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
305f0 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
30600 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
30610 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
30620 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
30630 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
30640 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
30650 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30660 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
30670 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
30680 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
30690 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
306a0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
306b0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
306c0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
306d0 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
306e0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
306f0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
30700 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
30710 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
30720 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
30730 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
30740 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
30750 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
30760 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
30770 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
30780 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
30790 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
307a0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
307b0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
307c0 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
307d0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
307e0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
307f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
30800 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
30810 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
30820 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
30830 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
30840 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
30850 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
30860 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
30870 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
30880 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
30890 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
308a0 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
308b0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
308c0 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
308d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
308e0 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
308f0 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
30900 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
30910 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
30920 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
30930 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
30940 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
30950 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
30960 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
30970 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
30980 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
30990 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
309a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
309b0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
309c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
309d0 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
309e0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
309f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
30a00 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
30a10 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
30a20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
30a30 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
30a40 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
30a50 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
30a60 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
30a70 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
30a80 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
30a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30aa0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30ab0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
30ac0 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
30ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30ae0 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
30af0 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
30b00 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
30b10 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
30b20 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
30b30 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
30b40 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
30b50 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
30b60 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
30b70 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30b80 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
30b90 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
30ba0 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
30bb0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
30bc0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
30bd0 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
30be0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
30bf0 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
30c00 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
30c10 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
30c20 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
30c30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
30c40 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
30c50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
30c60 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
30c70 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
30c80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30c90 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
30ca0 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
30cb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30cc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
30cd0 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
30ce0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
30cf0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
30d00 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
30d10 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
30d20 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
30d30 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
30d40 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
30d50 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
30d60 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
30d70 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
30d80 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
30d90 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
30da0 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
30db0 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
30dc0 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
30dd0 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
30de0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
30df0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
30e00 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
30e10 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
30e20 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
30e30 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
30e40 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
30e50 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
30e60 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
30e70 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
30e80 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
30e90 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
30ea0 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
30eb0 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
30ec0 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
30ed0 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
30ee0 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
30ef0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
30f00 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
30f10 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
30f20 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
30f30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30f40 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
30f50 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
30f60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
30f70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30f80 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
30f90 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
30fa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30fb0 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
30fc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30fd0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
30fe0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
30ff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31010 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
31020 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
31030 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
31040 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
31050 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
31060 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
31070 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
31080 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
31090 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
310a0 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
310b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
310c0 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
310d0 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
310e0 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
310f0 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
31100 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
31110 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
31120 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
31130 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
31140 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
31150 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
31160 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
31170 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
31180 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
31190 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
311a0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
311b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
311c0 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
311d0 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
311e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
311f0 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
31200 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
31210 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
31220 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
31230 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
31240 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
31250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
31260 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
31270 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
31280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31290 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
312a0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
312b0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
312c0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
312d0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
312e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
312f0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
31300 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
31310 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
31320 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31330 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
31340 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
31350 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
31360 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
31370 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
31380 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
31390 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
313a0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
313b0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
313c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
313d0 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
313e0 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
313f0 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
31400 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
31410 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
31420 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
31430 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
31440 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
31450 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
31460 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
31470 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
31480 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
31490 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
314a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
314b0 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
314c0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
314d0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
314e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
314f0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
31500 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
31510 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31520 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
31530 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31540 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
31550 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
31560 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
31570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
31590 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
315a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
315b0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
315c0 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
315d0 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
315e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
315f0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
31600 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
31620 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
31630 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31640 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
31650 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
31660 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
31670 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
31680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
31690 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
316a0 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
316b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
316c0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
316d0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
316e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
316f0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
31700 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
31710 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
31720 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
31730 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68           ** it h
31740 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
31750 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
31760 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
31770 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
31780 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
31790 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
317a0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
317b0 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
317c0 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
317d0 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
317e0 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
317f0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
31800 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
31810 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
31820 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
31830 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
31840 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
31850 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
31860 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
31870 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
31880 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
31890 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
318a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
318b0 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
318c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
318d0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
318e0 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
318f0 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
31900 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
31910 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
31920 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31930 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
31940 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
31950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31970 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31980 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
31990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
319a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
319b0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
319c0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
319d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
319e0 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
319f0 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
31a00 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75  ite3PagerGet() u
31a10 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
31a20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
31a30 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
31a40 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
31a50 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
31a60 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
31a70 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
31a80 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
31a90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
31aa0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
31ab0 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
31ac0 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
31ad0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
31ae0 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
31af0 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
31b00 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  tly in PAGER_OPE
31b10 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  N state (no lock
31b20 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
31b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31b40 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
31b50 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
31b60 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
31b70 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
31b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31b90 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
31ba0 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
31bb0 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
31bc0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
31bd0 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
31be0 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
31bf0 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
31c00 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
31c10 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
31c20 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
31c30 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
31c40 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
31c50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31c60 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
31c70 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
31c80 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
31c90 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
31ca0 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
31cb0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
31cc0 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
31cd0 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
31ce0 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
31cf0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
31d00 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
31d10 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
31d20 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
31d30 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
31d40 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
31d50 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
31d60 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
31d70 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
31d80 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
31d90 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
31da0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
31db0 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
31dc0 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
31dd0 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
31de0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
31df0 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
31e00 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
31e10 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
31e20 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
31e30 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
31e40 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
31e50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
31e60 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
31e70 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
31e80 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
31e90 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
31ea0 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
31eb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
31ec0 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  .** rolling back
31ed0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
31ee0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
31ef0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
31f00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
31f10 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
31f20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
31f30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
31f40 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
31f50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
31f60 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
31f70 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
31f80 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
31f90 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
31fa0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
31fb0 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
31fc0 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ages. This impli
31fd0 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
31fe0 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65  r state should e
31ff0 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50  ither.  ** be OP
32000 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45  EN or READER. RE
32010 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADER is only pos
32020 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67  sible if the pag
32030 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20  er is or was in 
32040 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  .  ** exclusive 
32050 61 63 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f  access mode.  */
32060 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32070 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
32080 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
32090 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
320a0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
320b0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
320c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
320d0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
320e0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
320f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
32100 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
32110 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
32120 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
32130 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
32140 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
32150 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32160 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
32170 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   int bHotJournal
32180 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f   = 1;          /
32190 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
321a0 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75  exists a hot jou
321b0 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal-file */..  
321c0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
321d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
321e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
321f0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
32200 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
32210 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20  LOCK );..    rc 
32220 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
32230 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
32240 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
32250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32260 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
32270 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
32280 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
32290 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
322a0 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
322b0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
322c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
322d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
322e0 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
322f0 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
32300 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
32310 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
32320 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
32330 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
32340 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
32350 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
32360 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
32370 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  <=SHARED_LOCK ){
32380 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
32390 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
323a0 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b  , &bHotJournal);
323b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
323c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
323d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
323e0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
323f0 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a   bHotJournal ){.
32400 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
32410 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
32420 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32430 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
32440 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ACK;.        got
32450 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
32460 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  }..      /* Get 
32470 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
32480 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
32490 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
324a0 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
324b0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
324c0 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
324d0 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
324e0 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
324f0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
32500 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
32510 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
32520 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
32530 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
32540 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
32550 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
32560 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
32570 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
32580 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
32590 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
325a0 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
325b0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
325c0 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
325d0 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
325e0 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
325f0 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
32600 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
32610 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
32620 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
32630 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
32640 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
32650 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
32660 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
32670 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
32680 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
32690 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
326a0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
326b0 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
326c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
326d0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
326e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
326f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
32700 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
32710 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  is in locking_mo
32720 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
32730 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20  e, the lock is. 
32740 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64       ** downgrad
32750 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43  ed to SHARED_LOC
32760 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  K before this fu
32770 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
32780 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
32790 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
327a0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
327b0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  E_LOCK);.      i
327c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
327d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
327e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
327f0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  . .      /* If i
32800 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
32810 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69   open and the fi
32820 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  le exists on dis
32830 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20  k, open the .   
32840 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f     ** journal fo
32850 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
32860 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73  ess. Write acces
32870 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
32880 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  cause .      ** 
32890 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
328a0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
328b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
328c0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a  l be kept open .
328d0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73        ** and pos
328e0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
328f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
32900 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69  er on. Also, wri
32910 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20  te-access .     
32920 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72   ** is usually r
32930 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c  equired to final
32940 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
32950 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
32960 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a  persist .      *
32970 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f  * mode (and also
32980 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   for journal_mod
32990 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f  e=truncate on so
329a0 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20  me systems)..   
329b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
329c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
329d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
329e0 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
329f0 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
32a00 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
32a10 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
32a20 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
32a30 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
32a40 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
32a50 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
32a60 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
32a70 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
32a80 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  t .      ** may 
32a90 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
32aa0 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
32ab0 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
32ac0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
32ad0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
32ae0 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
32af0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
32b00 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
32b10 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
32b20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32b30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32b40 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
32b50 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
32b60 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  s;.        int b
32b70 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  Exists;         
32b80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
32b90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
32ba0 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  sts */.        r
32bb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
32bc0 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20  ess(.           
32bd0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
32be0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
32bf0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
32c00 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  bExists);.      
32c10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32c20 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29  _OK && bExists )
32c30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
32c40 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
32c50 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
32c60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
32c70 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
32c80 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
32c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
32ca0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
32cc0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
32cd0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32ce0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32cf0 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
32d00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
32d10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32d20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
32d30 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
32d40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32d50 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
32d60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
32d70 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
32d80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
32d90 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
32da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32db0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
32dc0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
32dd0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32de0 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
32df0 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
32e00 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
32e10 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
32e20 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
32e30 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
32e40 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
32e50 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
32e60 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
32e70 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
32e80 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
32e90 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
32ea0 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
32eb0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
32ec0 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
32ed0 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
32ee0 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
32ef0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
32f00 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
32f10 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
32f20 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
32f30 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
32f40 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
32f50 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
32f60 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
32f70 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
32f80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
32f90 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
32fa0 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
32fb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32fc0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32fd0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
32fe0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
32ff0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
33000 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
33010 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
33020 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33040 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
33050 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
33060 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74  ager, !pPager->t
33070 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
33080 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
33090 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
330a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
330b0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
330c0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
330d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
330e0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
330f0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
33100 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33110 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33120 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
33130 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
33140 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
33150 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
33160 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
33170 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
33180 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
33190 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
331a0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
331b0 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
331c0 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
331d0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
331e0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
331f0 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
33200 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
33210 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
33220 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
33230 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
33240 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
33250 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
33260 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
33270 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
33280 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
33290 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
332a0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
332b0 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
332c0 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
332d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
332e0 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
332f0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
33300 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
33310 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
33320 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
33330 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
33340 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
33350 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
33360 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
33370 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
33380 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
33390 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
333a0 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
333b0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
333c0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
333d0 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
333e0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
333f0 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
33400 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
33410 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
33420 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
33430 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
33440 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
33450 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
33460 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
33470 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
33480 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
33490 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
334a0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
334b0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
334c0 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
334d0 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
334e0 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
334f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
33500 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
33510 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
33520 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
33530 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
33540 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
33550 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
33560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33570 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
33580 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
33590 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
335a0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
335b0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
335c0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
335d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
335e0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
335f0 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61  >tempFile && pPa
33600 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
33610 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  edLock ){.      
33620 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
33630 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
33640 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63   acquired then c
33650 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  heck to.      **
33660 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
33670 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
33680 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
33690 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
336a0 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66  nged,.      ** f
336b0 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
336c0 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72   The hasHeldShar
336d0 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76  edLock flag prev
336e0 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20  ents this from. 
336f0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e       ** occurrin
33700 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69  g on the very fi
33710 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20  rst access to a 
33720 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74  file, in order t
33730 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  o save a.      *
33740 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73  * single unneces
33750 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65  sary sqlite3OsRe
33760 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65  ad() call at the
33770 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20   start-up..     
33780 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
33790 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72  abase changes ar
337a0 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  e detected by lo
337b0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
337c0 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
337d0 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
337e0 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
337f0 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
33800 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
33810 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
33820 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
33830 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
33840 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
33850 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
33860 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
33870 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
33880 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
33890 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
338a0 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
338b0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
338c0 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
338d0 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
338e0 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
338f0 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
33900 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
33910 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
33920 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
33930 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
33940 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
33950 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
33960 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
33970 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f     */.      Pgno
33980 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20   nPage = 0;.    
33990 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
339a0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
339b0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
339c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
339d0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
339e0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
339f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
33a00 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66  ailed;..      if
33a10 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
33a20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
33a30 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
33a40 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
33a50 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
33a60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33a70 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
33a80 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
33a90 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33aa0 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
33ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33ac0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
33ad0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
33ae0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
33af0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
33b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33b10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
33b20 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
33b30 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
33b40 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
33b50 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
33b60 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
33b70 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
33b80 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33b90 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
33ba0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
33bb0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
33bc0 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
33bd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
33be0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
33bf0 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
33c00 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
33c10 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
33c20 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
33c30 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
33c40 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
33c50 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
33c60 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
33c70 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
33c80 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
33c90 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
33ca0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
33cb0 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
33cc0 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
33cd0 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
33ce0 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
33cf0 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
33d00 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
33d10 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
33d20 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
33d30 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
33d40 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
33d50 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
33d60 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
33d70 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
33d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
33d90 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
33da0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
33db0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33dc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
33dd0 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
33de0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
33df0 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
33e00 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
33e10 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
33e20 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
33e30 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
33e40 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
33e50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33e60 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
33e70 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
33e80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33e90 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
33ea0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
33eb0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
33ec0 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
33ed0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
33ee0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
33ef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
33f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
33f10 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
33f20 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
33f30 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
33f40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
33f50 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67  pFile==0 && pPag
33f60 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33f70 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
33f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
33f90 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
33fa0 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
33fb0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
33fc0 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
33fd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33fe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
33ff0 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
34000 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
34010 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
34020 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
34030 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
34040 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
34050 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
34060 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
34070 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
34080 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20  dLock = 1;.  }. 
34090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
340a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
340b0 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
340c0 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
340d0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
340e0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
340f0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
34100 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
34110 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
34120 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
34130 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
34140 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
34150 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
34160 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
34170 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
34180 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
34190 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
341a0 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
341b0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
341c0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
341d0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
341e0 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
341f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
34200 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26  r->nMmapOut==0 &
34210 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  & (sqlite3Pcache
34220 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
34230 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b  >pPCache)==0) ){
34240 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
34250 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
34260 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
34270 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65  * The page gette
34280 72 20 6d 65 74 68 6f 64 73 20 65 61 63 68 20 74  r methods each t
34290 72 79 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ry to acquire a 
342a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a  reference to a.*
342b0 2a 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  * page with page
342c0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 49 66   number pgno. If
342d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
342e0 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
342f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
34300 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
34310 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
34320 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
34330 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
34340 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
34350 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
34360 20 6f 66 20 74 68 65 20 67 65 74 74 65 72 20 6d   of the getter m
34370 65 74 68 6f 64 20 64 65 70 65 6e 64 69 6e 67 0a  ethod depending.
34380 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
34390 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  t state of the p
343a0 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ager..**.**     
343b0 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 29 20  getPageNormal() 
343c0 20 20 20 20 20 20 20 20 2d 2d 20 20 54 68 65 20          --  The 
343d0 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72 0a 2a 2a  normal getter.**
343e0 20 20 20 20 20 67 65 74 50 61 67 65 45 72 72 6f       getPageErro
343f0 72 28 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20  r()          -- 
34400 20 55 73 65 64 20 69 66 20 74 68 65 20 70 61 67   Used if the pag
34410 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
34420 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 20 67  r state.**     g
34430 65 74 50 61 67 65 4d 6d 61 70 28 29 20 20 20 20  etPageMmap()    
34440 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20         --  Used 
34450 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  if memory-mapped
34460 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 0a   I/O is enabled.
34470 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
34480 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
34490 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
344a0 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
344b0 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
344c0 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
344d0 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
344e0 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
344f0 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
34500 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
34510 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
34520 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
34530 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
34540 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
34550 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
34560 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
34570 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
34580 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
34590 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
345a0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
345b0 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
345c0 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
345d0 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
345e0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
345f0 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
34600 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
34610 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
34620 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
34630 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
34640 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
34650 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
34660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34670 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
34680 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
34690 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
346a0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
346b0 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
346c0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
346d0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
346e0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
346f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
34700 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a 20 74 68  age or if .** th
34710 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
34720 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 50  r contains the P
34730 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
34740 4e 54 20 62 69 74 20 61 6e 64 20 74 68 65 20 0a  NT bit and the .
34750 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
34760 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
34770 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
34780 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
34790 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
347a0 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
347b0 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
347c0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
347d0 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
347e0 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
347f0 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
34800 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
34810 45 4e 54 20 69 73 20 74 72 75 65 2c 20 69 74 20  ENT is true, it 
34820 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
34830 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
34840 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
34850 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
34860 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
34870 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
34880 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
34890 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
348a0 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
348b0 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
348c0 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
348d0 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
348e0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
348f0 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
34900 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
34910 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
34920 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
34930 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
34940 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
34950 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
34960 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
34970 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   If PAGER_GET_NO
34980 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c  CONTENT is true,
34990 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
349a0 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
349b0 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  d instead.** of 
349c0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
349d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
349e0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
349f0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
34a00 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
34a10 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
34a20 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
34a30 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
34a40 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
34a50 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
34a60 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
34a70 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
34a80 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
34a90 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
34aa0 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
34ab0 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
34ac0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
34ad0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
34ae0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
34af0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
34b00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34b10 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
34b20 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
34b30 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
34b40 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
34b50 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
34b60 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
34b70 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
34b80 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
34b90 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
34ba0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
34bb0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
34bc0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
34bd0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
34be0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
34bf0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
34c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
34c10 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
34c20 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
34c30 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
34c40 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
34c50 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
34c60 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
34c70 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
34c80 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
34c90 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
34ca0 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
34cb0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
34cc0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
34cd0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
34ce0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
34cf0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
34d00 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
34d10 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
34d20 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
34d30 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
34d40 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
34d50 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
34d60 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
34d70 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
34d80 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
34d90 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
34da0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
34db0 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  t getPageNormal(
34dc0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
34dd0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
34de0 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
34df0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
34e00 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
34e10 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
34e20 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
34e30 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
34e40 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
34e50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
34e60 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
34e70 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
34e80 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
34e90 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
34ea0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
34eb0 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20  ITE_OK;.  PgHdr 
34ec0 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f 43 6f 6e  *pPg;.  u8 noCon
34ed0 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  tent;           
34ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34ef0 69 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  if PAGER_GET_NOC
34f00 4f 4e 54 45 4e 54 20 69 73 20 73 65 74 20 2a 2f  ONTENT is set */
34f10 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
34f20 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 0a  e_page *pBase;..
34f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34f40 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
34f50 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
34f60 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
34f70 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
34f80 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
34f90 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
34fa0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
34fb0 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48  rt( pPager->hasH
34fc0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31  eldSharedLock==1
34fd0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
34fe0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
34ff0 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  ENT.  /* If this
35000 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e   is an CONCURREN
35010 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  T transaction an
35020 64 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  d the page being
35030 20 72 65 61 64 20 77 61 73 0a 20 20 2a 2a 20 70   read was.  ** p
35040 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61  resent in the da
35050 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
35060 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
35070 20 77 61 73 20 6f 70 65 6e 65 64 2c 0a 20 20 2a   was opened,.  *
35080 2a 20 6d 61 72 6b 20 69 74 20 61 73 20 72 65 61  * mark it as rea
35090 64 20 69 6e 20 74 68 65 20 70 41 6c 6c 52 65 61  d in the pAllRea
350a0 64 20 76 65 63 74 6f 72 2e 20 20 2a 2f 0a 20 20  d vector.  */.  
350b0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
350c0 52 65 61 64 20 26 26 20 70 67 6e 6f 3c 3d 70 50  Read && pgno<=pP
350d0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
350e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
350f0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
35100 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 2c 20  ager->pAllRead, 
35110 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
35120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
35130 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
35140 65 5f 65 72 72 3b 0a 20 20 7d 0a 23 65 6e 64 69  e_err;.  }.#endi
35150 66 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  f..  if( pgno==0
35160 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
35170 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35180 20 70 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33   pBase = sqlite3
35190 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
351a0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
351b0 6f 2c 20 33 29 3b 0a 20 20 69 66 28 20 70 42 61  o, 3);.  if( pBa
351c0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 67  se==0 ){.    pPg
351d0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
351e0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
351f0 68 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e  hStress(pPager->
35200 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26  pPCache, pgno, &
35210 70 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  pBase);.    if( 
35220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
35230 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35240 72 65 5f 65 72 72 3b 0a 20 20 20 20 69 66 28 20  re_err;.    if( 
35250 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pBase==0 ){.    
35260 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
35270 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
35280 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35290 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  re_err;.    }.  
352a0 7d 0a 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67  }.  pPg = *ppPag
352b0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
352c0 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61  eFetchFinish(pPa
352d0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
352e0 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 61 73  no, pBase);.  as
352f0 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50  sert( pPg==(*ppP
35300 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
35310 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  ( pPg->pgno==pgn
35320 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
35330 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
35340 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  er || pPg->pPage
35350 72 3d 3d 30 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e  r==0 );..  noCon
35360 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20  tent = (flags & 
35370 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
35380 45 4e 54 29 21 3d 30 3b 0a 20 20 69 66 28 20 70  ENT)!=0;.  if( p
35390 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  Pg->pPager && !n
353a0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
353b0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
353c0 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
353d0 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
353e0 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
353f0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
35400 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
35410 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
35420 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35430 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
35440 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
35450 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
35460 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
35470 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
35480 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
35490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
354a0 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
354b0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
354c0 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
354d0 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
354e0 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
354f0 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
35500 61 6c 69 7a 65 64 2e 20 42 75 74 20 66 69 72 73  alized. But firs
35510 74 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 68 65  t some error che
35520 63 6b 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cks:.    **.    
35530 2a 2a 20 28 31 29 20 54 68 65 20 6d 61 78 69 6d  ** (1) The maxim
35540 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
35550 73 20 32 5e 33 31 0a 20 20 20 20 2a 2a 20 28 32  s 2^31.    ** (2
35560 29 20 4e 65 76 65 72 20 74 72 79 20 74 6f 20 66  ) Never try to f
35570 65 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67  etch the locking
35580 20 70 61 67 65 0a 20 20 20 20 2a 2f 0a 20 20 20   page.    */.   
35590 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
355a0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
355b0 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
355c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
355d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
355e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
355f0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
35600 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
35610 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
35620 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 61  = pPager;..    a
35630 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
35640 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 21 4d  Pager->fd) || !M
35650 45 4d 44 42 20 29 3b 0a 20 20 20 20 69 66 28 20  EMDB );.    if( 
35660 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
35670 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  fd) || pPager->d
35680 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f  bSize<pgno || no
35690 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
356a0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
356b0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
356c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
356d0 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f  FULL;.        go
356e0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
356f0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
35700 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
35710 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
35720 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
35730 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
35740 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
35750 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
35760 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
35770 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
35780 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
35790 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
357a0 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
357b0 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
357c0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
357d0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
357e0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
357f0 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
35800 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
35810 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
35820 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
35830 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
35840 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
35850 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
35860 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
35870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
35880 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
35890 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
358a0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
358b0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
358c0 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
358d0 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
358e0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
358f0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
35900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
35910 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
35920 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
35930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
35940 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
35950 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
35960 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
35970 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
35980 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
35990 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
359a0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
359b0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
359c0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
359d0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
359e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
359f0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
35a00 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
35a10 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
35a20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35a30 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
35a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35a50 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65    /* Frame to re
35a60 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  ad from WAL file
35a70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 61   */.      if( pa
35a80 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
35a90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
35aa0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
35ab0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
35ac0 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
35ad0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
35ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
35af0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35b00 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
35b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
35b20 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
35b30 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  r );.      pPage
35b40 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
35b50 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20  TAT_MISS]++;.   
35b60 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
35b70 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b  ge(pPg, iFrame);
35b80 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
35b90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35ba0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
35bb0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
35bc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
35bd0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
35be0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
35bf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
35c00 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35c10 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
35c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
35c30 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
35c40 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
35c50 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
35c60 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
35c70 28 70 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50  (pPager);.  *ppP
35c80 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
35c90 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  n rc;.}..#if SQL
35ca0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
35cb0 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20  E>0./* The page 
35cc0 67 65 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20  getter for when 
35cd0 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
35ce0 4f 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  O is enabled */.
35cf0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
35d00 67 65 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20  geMMap(.  Pager 
35d10 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
35d20 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
35d30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35d40 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
35d50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
35d60 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
35d70 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
35d80 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
35d90 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
35da0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
35db0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
35dc0 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
35dd0 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
35de0 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  gs */.){.  int r
35df0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35e00 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
35e10 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20  .  u32 iFrame = 
35e20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
35e30 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72     /* Frame to r
35e40 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c  ead from WAL fil
35e50 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
35e60 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75   acceptable to u
35e70 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28  se a read-only (
35e80 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61  mmap) page for a
35e90 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20  ny page except. 
35ea0 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68   ** page 1 if th
35eb0 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d  ere is no write-
35ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
35ed0 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f   or the ACQUIRE_
35ee0 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c  READONLY.  ** fl
35ef0 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
35f00 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
35f10 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74  And so long as t
35f20 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a  he db is not a .
35f30 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f    ** temporary o
35f40 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
35f50 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73  base.  */.  cons
35f60 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20  t int bMmapOk = 
35f70 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70  (pgno>1.   && (p
35f80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35f90 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28  AGER_READER || (
35fa0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
35fb0 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29  T_READONLY)).  )
35fc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 55 53 45  ;..  assert( USE
35fd0 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 3b  FETCH(pPager) );
35fe0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
35ff0 41 53 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72  AS_CODEC.  asser
36000 74 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  t( pPager->xCode
36010 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  c==0 );.#endif..
36020 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f    /* Optimizatio
36030 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20  n note:  Adding 
36040 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65  the "pgno<=1" te
36050 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d  rm before "pgno=
36060 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c  =0" here.  ** al
36070 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lows the compile
36080 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72  r optimizer to r
36090 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73  euse the results
360a0 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22   of the "pgno>1"
360b0 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68  .  ** test in th
360c0 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65  e previous state
360d0 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20  ment, and avoid 
360e0 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20  testing pgno==0 
360f0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d  in the.  ** comm
36100 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67  on case where pg
36110 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a  no is large. */.
36120 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26    if( pgno<=1 &&
36130 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
36140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
36150 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
36160 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36170 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
36180 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
36190 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
361a0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
361b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
361c0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
361d0 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  dLock==1 );.  as
361e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
361f0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
36200 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70   );..  if( bMmap
36210 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61  Ok && pagerUseWa
36220 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
36230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
36240 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
36250 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
36260 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  Frame);.    if( 
36270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36280 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
36290 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
362a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
362b0 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
362c0 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  iFrame==0 ){.   
362d0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30   void *pData = 0
362e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
362f0 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72  e3OsFetch(pPager
36300 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28  ->fd, .        (
36310 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
36320 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
36330 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
36340 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b  e, &pData.    );
36350 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36360 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20  ITE_OK && pData 
36370 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
36380 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
36390 52 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67  R_READER || pPag
363a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
363b0 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71          pPg = sq
363c0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
363d0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
363e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
363f0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
36400 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63      rc = pagerAc
36410 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61  quireMapPage(pPa
36420 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61  ger, pgno, pData
36430 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 7d 65  , &pPg);.     }e
36440 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
36450 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
36460 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
36470 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
36480 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
36490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
364a0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
364b0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
364c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
364d0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
364e0 67 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  g;.        retur
364f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
36500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
36510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36520 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
36530 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
36540 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
36550 7d 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61  }.  return getPa
36560 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c  geNormal(pPager,
36570 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
36580 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  lags);.}.#endif 
36590 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
365a0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
365b0 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72   The page getter
365c0 20 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e   method for when
365d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e   the pager is an
365e0 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
365f0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
36600 67 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72  geError(.  Pager
36610 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
36620 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
36630 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36640 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
36650 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
36660 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
36670 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
36680 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
36690 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
366a0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
366b0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
366c0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
366d0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
366e0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ags */.){.  UNUS
366f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e  ED_PARAMETER(pgn
36700 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  o);.  UNUSED_PAR
36710 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20  AMETER(flags);. 
36720 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36730 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
36740 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  _OK );.  *ppPage
36750 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
36760 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
36770 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20  }.../* Dispatch 
36780 61 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72  all page fetch r
36790 65 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61  equests to the a
367a0 70 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65  ppropriate gette
367b0 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74  r method..*/.int
367c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
367d0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
367e0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
367f0 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
36800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
36810 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
36820 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36830 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
36840 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
36850 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
36860 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
36870 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
36880 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
36890 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
368a0 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
368b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
368c0 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c  er->xGet(pPager,
368d0 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
368e0 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lags);.}../*.** 
368f0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
36900 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
36910 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
36920 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
36930 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
36940 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
36950 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
36960 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
36970 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
36980 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
36990 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
369a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
369b0 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
369c0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
369d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
369e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
369f0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
36a00 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
36a10 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
36a20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
36a30 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
36a40 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
36a50 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
36a60 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
36a70 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
36a80 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
36a90 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
36aa0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
36ab0 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
36ac0 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
36ad0 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
36ae0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
36af0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  {.  sqlite3_pcac
36b00 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a  he_page *pPage;.
36b10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36b20 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
36b30 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
36b40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
36b50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50  Cache!=0 );.  pP
36b60 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
36b70 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
36b80 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
36b90 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  0);.  assert( pP
36ba0 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  age==0 || pPager
36bb0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
36bc0 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ock );.  if( pPa
36bd0 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
36be0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
36bf0 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
36c00 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
36c10 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  che, pgno, pPage
36c20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
36c30 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
36c40 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
36c50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
36c60 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
36c70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
36c80 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
36c90 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
36ca0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
36cb0 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
36cc0 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
36cd0 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
36ce0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
36cf0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
36d00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
36d10 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
36d20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
36d30 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44  erUnrefNotNull(D
36d40 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
36d50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
36d60 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29  assert( pPg!=0 )
36d70 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67  ;.  pPager = pPg
36d80 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
36d90 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
36da0 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70  DR_MMAP ){.    p
36db0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
36dc0 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
36dd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
36de0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
36df0 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
36e00 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
36e10 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  r);.}.void sqlit
36e20 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
36e30 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
36e40 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61   pPg ) sqlite3Pa
36e50 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36e60 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPg);.}../*.** T
36e70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36e80 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
36e90 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
36ea0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
36eb0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
36ec0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
36ed0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
36ee0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36ef0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
36f00 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
36f10 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
36f20 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
36f30 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
36f40 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
36f50 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
36f60 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
36f70 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
36f80 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
36f90 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
36fa0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
36fb0 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
36fc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
36fd0 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
36fe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
36ff0 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
37000 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
37010 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
37020 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
37030 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
37040 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
37050 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
37060 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
37070 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
37080 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
37090 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
370a0 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
370b0 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
370c0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
370d0 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
370e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
370f0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
37100 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
37110 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
37120 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
37130 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37140 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
37150 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
37160 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
37170 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
37180 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
37190 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
371a0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
371b0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
371c0 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
371d0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
371e0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
371f0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
37200 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
37210 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
37220 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
37230 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
37240 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
37250 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
37260 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
37270 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
37280 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
37290 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
372a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
372b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
372d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
372e0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
372f0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
37300 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
37310 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
37320 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
37330 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37340 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
37360 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
37370 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
37380 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37390 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
373a0 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
373b0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
373c0 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
373d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
373e0 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
373f0 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
37400 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
37410 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
37420 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
37430 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
37440 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
37450 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
37460 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
37470 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
37480 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
37490 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
374a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
374b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
374c0 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50  DE_OFF ){.    pP
374d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
374e0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
374f0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
37500 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
37510 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37520 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
37530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
37540 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
37550 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68   .    /* Open th
37560 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
37570 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
37580 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20  ady open. */.   
37590 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
375a0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
375b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
375c0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
375d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
375e0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  MORY ){.        
375f0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
37600 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
37610 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
37620 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
37630 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
37640 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
37650 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
37660 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69 6c         int nSpil
37670 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  l;..        if( 
37680 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
37690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
376a0 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
376b0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
376c0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
376d0 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  MP_JOURNAL);.   
376e0 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20         nSpill = 
376f0 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
37700 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20  tmtSpill;.      
37710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37720 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
37730 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
37740 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
37750 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66  nSpill = jrnlBuf
37760 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ferSize(pPager);
37770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37780 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a       .        /*
37790 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
377a0 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20   database still 
377b0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
377c0 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e  e as it did when
377d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77  .        ** it w
377e0 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  as originally op
377f0 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ened. */.       
37800 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73   rc = databaseIs
37810 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b  Unmoved(pPager);
37820 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
37830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37840 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37850 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20  ite3JournalOpen 
37860 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
37870 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
37880 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
37890 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69  jfd, flags, nSpi
378a0 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  ll.          );.
378b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
378c0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
378d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
378e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
378f0 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
37900 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
37910 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
37920 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
37930 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
37940 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
37950 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
37960 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
37970 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
37980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37990 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
379a0 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
379b0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
379c0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
379d0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
379e0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
379f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
37a00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
37a10 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
37a20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
37a30 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
37a40 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
37a50 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
37a60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
37a70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37a80 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
37a90 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
37aa0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
37ab0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
37ac0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
37ad0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
37ae0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37af0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37b00 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
37b10 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
37b20 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
37b30 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
37b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
37b50 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
37b60 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
37b70 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
37b80 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
37b90 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
37ba0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
37bb0 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
37bc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
37bd0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
37be0 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
37bf0 74 20 69 73 20 30 2c 20 74 68 65 6e 20 61 63 71  t is 0, then acq
37c00 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
37c10 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
37c20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
37c30 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
37c40 20 69 73 20 3e 30 2c 20 74 68 65 6e 20 61 63 71   is >0, then acq
37c50 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
37c60 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
37c70 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
37c80 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
37c90 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
37ca0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
37cb0 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
37cc0 2a 2a 20 49 66 20 28 65 78 46 6c 61 67 3c 30 29  ** If (exFlag<0)
37cd0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
37ce0 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  e is in WAL mode
37cf0 2c 20 64 6f 20 6e 6f 74 20 74 61 6b 65 20 61 6e  , do not take an
37d00 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65 20  y locks..** The 
37d10 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
37d20 20 72 75 6e 20 69 6e 20 43 4f 4e 43 55 52 52 45   run in CONCURRE
37d30 4e 54 20 6d 6f 64 65 20 69 6e 73 74 65 61 64 2e  NT mode instead.
37d40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
37d50 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
37d60 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
37d70 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
37d80 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
37d90 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
37da0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
37db0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
37dc0 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
37dd0 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
37de0 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
37df0 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
37e00 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
37e10 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
37e20 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
37e30 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
37e40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
37e50 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
37e60 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
37e70 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
37e80 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
37e90 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
37ea0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
37eb0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
37ec0 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
37ed0 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
37ee0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
37ef0 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
37f00 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
37f10 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
37f20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
37f30 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
37f40 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
37f50 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
37f60 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
37f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
37f80 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
37f90 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
37fa0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
37fb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37fc0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
37fd0 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
37fe0 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
37ff0 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
38000 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
38010 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
38020 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
38030 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
38040 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
38050 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
38060 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
38070 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   );.    if( page
38080 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
38090 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
380a0 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
380b0 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
380c0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
380d0 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
380e0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
380f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
38100 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
38110 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
38120 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
38130 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
38140 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
38150 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
38160 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
38170 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
38180 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
38190 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
381a0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
381b0 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
381c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
381d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
381e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
381f0 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
38200 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
38210 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
38220 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 1);.      }.
38230 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74  .      /* Grab t
38240 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
38250 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
38260 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70  f successful, up
38270 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a  grade to.      *
38280 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
38290 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
382a0 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
382b0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
382c0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  aller..      ** 
382d0 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  The busy-handler
382e0 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20   is not invoked 
382f0 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  if another conne
38300 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20  ction already.  
38310 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65      ** holds the
38320 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20   write-lock. If 
38330 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70  possible, the up
38340 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63  per layer will c
38350 61 6c 6c 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20  all it.  */.    
38360 20 20 69 66 28 20 65 78 46 6c 61 67 3e 3d 30 20    if( exFlag>=0 
38370 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38380 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57  sqlite3WalBeginW
38390 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
383a0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
383b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
383c0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
383d0 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
383e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
383f0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
38400 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
38410 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
38420 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
38430 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
38440 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
38450 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
38460 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
38470 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
38480 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
38490 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
384a0 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
384b0 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
384c0 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
384d0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
384e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
384f0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
38500 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
38510 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
38520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
38530 20 65 78 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20   exFlag>0 ){.   
38540 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
38550 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
38560 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
38570 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
38580 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
38590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
385a0 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
385b0 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
385c0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
385d0 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
385e0 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61   sets Pager.eSta
385f0 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54  te to PAGER_WRIT
38600 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43  ER_LOCKED or CAC
38610 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77  HEMOD.      ** w
38620 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
38630 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
38640 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d  but never to DBM
38650 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a  OD or FINISHED..
38660 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
38670 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73   because in thos
38680 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64  e states the cod
38690 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
386a0 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
386b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
386c0 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
386d0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
386e0 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
386f0 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66  base .      ** f
38700 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69  ile as well as i
38710 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
38720 68 65 2e 2