/ Hex Artifact Content
Login

Artifact cbc8996b773c191107b771424b529307ffdf19ba:


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 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61  ITE_OMIT_WAL.sta
9550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65  tic int pagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
95a0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
95b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95c0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
95d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
95e0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
95f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9600: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9610: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9620: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9630: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9640: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9650: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9660: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9670: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9680: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9690: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
96a0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
96b0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
96c0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
96d0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
96e0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
96f0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9700: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9710: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9720: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9730: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9740: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9750: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9760: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9770: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9780: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9790: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
97a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97b0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
97c0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97d0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
97e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
97f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9800: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9830: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9840: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9850: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9860: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9870: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9880: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9890: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
98a0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
98b0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
98c0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
98d0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
98e0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
98f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9900: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9910: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9920: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9930: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9940: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9950: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9960: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9970: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9980: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9990: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
99a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
99b0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
99c0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
99d0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
99e0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
99f0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9a10: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9a20: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9a40: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9a50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9a60: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9a70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9a80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9a90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9aa0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9ab0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9ac0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9ad0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9ae0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9af0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9b00: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9b10: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9b20: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9b30: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9b40: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
9b50: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
9b60: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
9b70: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
9b80: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
9b90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
9ba0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9bb0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9bc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9bd0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9be0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9bf0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9c00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9c10: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9c20: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9c40: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
9c50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9c60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
9c70: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
9c80: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
9c90: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
9ca0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9cb0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9cc0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9cd0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9cf0: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9d00: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9d10: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9d20: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9d30: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9d40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9d50: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9d60: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
9d70: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
9d80: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
9d90: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
9da0: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9db0: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9dc0: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9dd0: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9de0: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9df0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9e00: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9e10: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9e20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9e40: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9e50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9e60: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9e70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9e80: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
9e90: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
9ea0: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
9eb0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
9ec0: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
9ed0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
9ee0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9ef0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f00: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
9f20: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
9f30: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
9f40: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
9f50: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
9f60: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9f70: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
9f80: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f90: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9fa0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9fb0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9fc0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9fd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9fe0: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
9ff0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72  LOCK );.      br
a000: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a010: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a020: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a030: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a040: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a050: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a060: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a070: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
a080: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a090: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
a0a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a0b0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a0c0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
a0d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a0e0: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
a0f0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
a100: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a110: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a120: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a130: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a140: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a150: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a160: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a180: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a190: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a1a0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a1b0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a1c0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a1d0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a1e0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a1f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a200: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a210: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a220: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a230: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a240: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a250: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a260: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a270: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a280: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a290: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a2a0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a2b0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a2c0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a2d0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a2e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a2f0: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a300: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a310: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a320: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a330: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a340: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a350: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a360: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a370: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a380: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a390: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a3a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a3b0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a3c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a3d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a3e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a3f0: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a410: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a420: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a430: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a450: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a460: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a470: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a480: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a490: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a4a0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a4b0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a4c0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a4d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a4e0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a4f0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a500: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a510: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a530: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a540: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a550: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a560: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a570: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a580: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a590: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a5a0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a5b0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a5c0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a5d0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a5e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a5f0: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a600: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a620: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a630: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a650: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a660: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a670: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a680: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a690: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a6a0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a6b0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a6c0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a6d0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a6e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a6f0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a700: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a710: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a720: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a730: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a740: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a750: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a760: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a770: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a780: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a790: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a7a0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a7b0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a7c0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a7d0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a7e0: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a7f0: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a800: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a810: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a830: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a840: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a850: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a860: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a870: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a880: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20  ->pPCache)>0 || 
a890: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
a8a0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a8b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
a8c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
a8d0: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
a8e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a8f0: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
a900: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
a910: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
a920: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
a930: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
a940: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
a950: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
a960: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a970: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
a980: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
a990: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
a9a0: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
a9b0: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
a9c0: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
a9d0: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
a9e0: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
a9f0: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
aa00: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
aa10: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
aa20: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
aa30: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
aa40: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
aa50: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
aa60: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
aa70: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
aa80: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
aa90: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
aaa0: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
aab0: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
aac0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
aad0: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
aae0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
aaf0: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
ab00: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
ab10: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
ab20: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
ab30: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
ab40: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
ab50: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
ab60: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
ab70: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ab80: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
ab90: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
aba0: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
abb0: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
abc0: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
abd0: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
abe0: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
abf0: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
ac00: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
ac10: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
ac20: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
ac30: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ac40: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
ac50: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
ac60: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
ac70: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ac80: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
ac90: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
aca0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
acb0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
acc0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
acd0: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
ace0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
acf0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
ad00: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
ad10: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
ad20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ad30: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
ad40: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
ad50: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
ad60: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ad70: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
ad80: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
ad90: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
ada0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
adb0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
adc0: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
add0: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
ade0: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
adf0: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
ae00: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
ae10: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
ae20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
ae30: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
ae40: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
ae50: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
ae60: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
ae70: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
ae80: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
ae90: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
aea0: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
aeb0: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
aec0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
aed0: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
aee0: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
aef0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af00: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
af10: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
af20: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
af30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
af50: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
af60: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
af70: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af80: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
af90: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
afa0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
afb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
afc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
afd0: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
afe0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aff0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b000: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
b010: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
b020: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b030: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b040: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
b050: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
b060: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b070: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
b080: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
b090: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
b0a0: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
b0b0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
b0c0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
b0d0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
b0e0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
b0f0: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
b100: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
b110: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
b120: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b130: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
b140: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
b150: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
b160: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
b170: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
b180: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
b190: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
b1a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
b1b0: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
b1c0: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
b1d0: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
b1e0: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
b1f0: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
b200: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
b210: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
b220: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
b230: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
b240: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
b250: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
b260: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
b270: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
b280: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
b290: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
b2a0: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
b2b0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
b2c0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
b2d0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
b2e0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
b2f0: 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   *p;.  Pgno pgno
b300: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
b310: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
b320: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
b330: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
b340: 20 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61    p = &pPager->a
b350: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
b360: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
b370: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
b380: 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
b390: 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  ull(p->pInSavepo
b3a0: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
b3b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b3c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
b3d0: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
b3e0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
b3f0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
b400: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
b410: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
b420: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
b430: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
b440: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
b450: 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
b460: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b470: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
b480: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
b490: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65  pPg->pgno);.}.#e
b4a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
b4b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b4c0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
b4d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b4e0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
b4f0: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
b500: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
b510: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b520: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
b530: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
b540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
b550: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
b560: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
b570: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
b580: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
b590: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
b5a0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
b5b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
b5c0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
b5d0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
b5e0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
b5f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
b600: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
b610: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
b620: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
b630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b640: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
b650: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
b660: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b670: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
b680: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b690: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
b6a0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
b6b0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
b6c0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
b6d0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
b6e0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
b6f0: 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ,B).../*.** Writ
b700: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b710: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
b720: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b730: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
b740: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
b750: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
b760: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
b770: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
b780: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
b790: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
b7a0: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
b7b0: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
b7c0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
b7d0: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
b7e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
b7f0: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
b800: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
b810: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
b820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b830: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b840: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b850: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a  ither NO_LOCK.**
b860: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
b870: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
b880: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b890: 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  e call to xUnloc
b8a0: 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c  k().** succeeds,
b8b0: 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
b8c0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
b8d0: 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65   match the (atte
b8e0: 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e  mpted) new lock.
b8f0: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
b900: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
b910: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
b920: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
b930: 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
b940: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
b950: 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20  ify it. See the 
b960: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
b970: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a  e #define of .**
b980: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
b990: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
b9a0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
b9b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c  tic int pagerUnl
b9c0: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
b9d0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
b9e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b9f0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
ba00: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
ba10: 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
ba20: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b  er->eLock==eLock
ba30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba40: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
ba50: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
ba60: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
ba70: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
ba80: 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
ba90: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66  ager)==0 );.  if
baa0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
bab0: 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
bac0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
bad0: 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k>=eLock );.    
bae0: 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  rc = pPager->noL
baf0: 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ock ? SQLITE_OK 
bb00: 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  : sqlite3OsUnloc
bb10: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
bb20: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
bb30: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
bb40: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
bb50: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
bb60: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
bb70: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
bb80: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
bb90: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
bba0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
bbb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
bbc0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
bbd0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
bbe0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
bbf0: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
bc00: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
bc10: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
bc20: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
bc30: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
bc40: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
bc50: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
bc60: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
bc70: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
bc80: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
bc90: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
bca0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
bcb0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
bcc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
bcd0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
bce0: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
bcf0: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
bd00: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
bd10: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
bd20: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
bd30: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
bd40: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
bd50: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
bd60: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
bd70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bd80: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
bd90: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bda0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
bdb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bdc0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
bdd0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bde0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
bdf0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
be00: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
be10: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
be20: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
be30: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
be40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
be50: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
be60: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
be70: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
be80: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
be90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
bea0: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
beb0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bec0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
bed0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
bee0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
bef0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
bf00: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
bf10: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
bf20: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bf30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bf40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bf50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
bf60: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
bf70: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
bf80: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
bf90: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
bfa0: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
bfb0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
bfc0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
bfd0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
bfe0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
bff0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
c000: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
c010: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
c020: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
c030: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
c040: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
c050: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
c060: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c070: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
c080: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
c090: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
c0a0: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
c0b0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
c0c0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
c0d0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
c0e0: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
c0f0: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
c100: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
c110: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
c120: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
c130: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
c140: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
c150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
c160: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
c170: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
c180: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
c190: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
c1a0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c1b0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c1c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c1d0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
c1e0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
c1f0: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
c200: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
c210: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c220: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
c230: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
c240: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
c250: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
c260: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
c270: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
c280: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
c290: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
c2c0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
c2d0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
c2e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c2f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
c300: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
c310: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
c340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
c350: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c360: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
c370: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
c380: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
c390: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
c3a0: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
c3b0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
c3c0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
c3d0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
c3e0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
c3f0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
c400: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
c410: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c420: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
c430: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
c440: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
c450: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
c460: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
c470: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
c480: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c490: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
c4a0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
c4b0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
c4c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c4d0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
c4e0: 69 6e 65 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  ine jrnlBufferSi
c4f0: 7a 65 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ze(x) 0.#endif..
c500: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c510: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c520: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c530: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c540: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c550: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c560: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c570: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c580: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c590: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c5a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c5b0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c5c0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c5d0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c5e0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c5f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c600: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c610: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c620: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c630: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c640: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c650: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c660: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c670: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c680: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c690: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c6a0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c6b0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c6c0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c6d0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c6e0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c6f0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c700: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c710: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c720: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c730: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c740: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c750: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c760: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c780: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c790: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c7a0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c7b0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c7c0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c7d0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c7e0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c7f0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c800: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c810: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c820: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c830: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c840: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c850: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c860: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c870: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c880: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c890: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c8a0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c8b0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c8c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c8d0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c8e0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c8f0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c900: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c910: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c920: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c930: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c940: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c950: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c960: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c970: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c980: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c990: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c9a0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c9b0: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c9c0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c9d0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c9e0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c9f0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
ca00: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
ca10: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
ca20: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
ca30: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
ca40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ca50: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
ca60: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
ca70: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
ca80: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
ca90: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
caa0: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
cab0: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
cac0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
cad0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
cae0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
caf0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
cb00: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
cb10: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
cb20: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cb30: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cb40: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cb50: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cb60: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
cb70: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cb80: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cb90: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cba0: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cbb0: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cbc0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cbd0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cbe0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cbf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cc00: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cc10: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cc20: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cc30: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cc40: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cc50: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cc60: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cc70: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cc80: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cc90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cca0: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
ccb0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
ccc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
ccd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cce0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ccf0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cd00: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cd10: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cd20: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
cd30: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
cd40: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
cd50: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cd60: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
cd70: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cd80: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cd90: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cda0: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cdb0: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cdc0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cdd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cde0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cdf0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
ce00: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
ce10: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
ce20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
ce30: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
ce40: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
ce50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ce60: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
ce70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ce80: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ce90: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cea0: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
ceb0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cec0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ced0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cee0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cef0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cf00: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cf10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cf20: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cf30: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cf40: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cf50: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf70: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cf80: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cf90: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cfa0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cfc0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cfd0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cfe0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
d010: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d020: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
d030: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
d040: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
d050: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
d060: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
d070: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d080: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d090: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d0a0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d0b0: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d0c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d0d0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d0e0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d0f0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d100: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d110: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d120: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d130: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d140: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d150: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d160: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d170: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d180: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d190: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d1a0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d1b0: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d1c0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d1d0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d1e0: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d1f0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d200: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d210: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d220: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d230: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d240: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d250: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d260: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d270: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d280: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d290: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d2a0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d2b0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d2c0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d2d0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d2e0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d2f0: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d300: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d310: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d320: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d330: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d340: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d360: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d370: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d380: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d390: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d3a0: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d3b0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d3c0: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d3d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d3e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d3f0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d400: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d410: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d420: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d430: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d440: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d450: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d460: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d470: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d480: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d490: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d4a0: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d4b0: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d4c0: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d4d0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d500: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d550: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d560: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d570: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d580: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d590: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d5a0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d5b0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d5c0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d5d0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d5e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d5f0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d600: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d610: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d620: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d630: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d640: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d650: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d660: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d670: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d680: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d690: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d6a0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d6b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d6c0: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d6e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d6f0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d700: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d710: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d720: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d730: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d740: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d750: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d760: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d770: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d780: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d790: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d7a0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d7b0: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d7c0: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d7d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d7e0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d7f0: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d800: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d810: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d820: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d830: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d840: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d850: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d860: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d870: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d880: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d890: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d8a0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d8b0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d8c0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d8d0: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d8e0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d8f0: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d900: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d910: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d920: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d930: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d940: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d950: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d960: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d970: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d980: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d990: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d9a0: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d9b0: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d9c0: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d9d0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d9e0: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d9f0: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
da00: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
da10: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
da20: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
da30: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
da40: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
da50: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
da60: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
da70: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
da80: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
da90: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
daa0: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
dab0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
dac0: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
dad0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
dae0: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
daf0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
db00: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
db30: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
db40: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
db50: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
db60: 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75  ert( !sqlite3Jou
db70: 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
db80: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
db90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
dba0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
dbb0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
dbc0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
dbd0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
dbe0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
dbf0: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
dc00: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
dc10: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
dc20: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
dc30: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
dc40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
dc50: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
dc60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
dc70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dc80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
dc90: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
dca0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
dcb0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
dcc0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
dcd0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
dce0: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
dcf0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
dd00: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
dd10: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
dd20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dd30: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
dd40: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
dd50: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
dd60: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
dd70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
dd80: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
dd90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
dda0: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
ddb0: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
ddc0: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
ddd0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
dde0: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
ddf0: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
de00: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
de10: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
de20: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
de30: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
de40: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
de50: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
de60: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
de70: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
de80: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
de90: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
dea0: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
deb0: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
dec0: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
ded0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
dee0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
def0: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
df00: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
df10: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
df20: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
df30: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
df40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
df50: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
df60: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
df70: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
df80: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
df90: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
dfa0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
dfb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
dfc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
dfd0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
dfe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
dff0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
e000: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
e010: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
e020: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
e030: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e040: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
e050: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
e060: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
e070: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
e080: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
e090: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
e0a0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
e0b0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
e0c0: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
e0d0: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
e0e0: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
e0f0: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
e100: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
e110: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
e120: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
e130: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
e140: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
e150: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
e160: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
e170: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
e180: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
e190: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
e1a0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
e1b0: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
e1c0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
e1d0: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
e1e0: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
e1f0: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
e200: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
e210: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
e220: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
e230: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e240: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e250: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e260: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e270: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
e280: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
e290: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
e2a0: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
e2b0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
e2c0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
e2d0: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
e2e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
e2f0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
e300: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
e310: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
e320: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e340: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
e350: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
e360: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e390: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
e3a0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e3b0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
e3c0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
e3d0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
e3e0: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
e3f0: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
e400: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
e410: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
e420: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
e430: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
e440: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
e450: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
e460: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
e470: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
e480: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
e490: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
e4a0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
e4b0: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
e4c0: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
e4d0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
e4e0: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
e4f0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
e500: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
e510: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
e520: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e530: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
e550: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e560: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
e570: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e580: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
e590: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e5a0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
e5b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
e5c0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
e5d0: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
e5e0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
e5f0: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
e600: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
e610: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
e620: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
e630: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
e640: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
e650: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
e660: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e670: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e680: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e690: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e6a0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e6b0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e6c0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e6d0: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e6e0: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e6f0: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e700: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e710: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e720: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e730: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e740: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e750: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e760: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e770: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e780: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e790: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e7a0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e7b0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e7c0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e7d0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e7e0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e7f0: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e800: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e810: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e820: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e830: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e840: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e850: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e860: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e870: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e880: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e890: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e8a0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e8b0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
e8c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
e8d0: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
e8e0: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
e8f0: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
e900: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
e910: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
e920: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
e930: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e940: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
e950: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
e960: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
e970: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
e980: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
e990: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
e9a0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
e9b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
e9c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e9d0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
e9e0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e9f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
ea00: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
ea10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
ea20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ea30: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
ea40: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
ea50: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ea60: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
ea70: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
ea80: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
ea90: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
eaa0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
eab0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
eac0: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
ead0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
eae0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
eaf0: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
eb00: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
eb10: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
eb20: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
eb30: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
eb40: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
eb50: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
eb60: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20  itializer */ .  
eb70: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
eb80: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
eb90: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
eba0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ebb0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
ebc0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ebd0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
ebe0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
ebf0: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
ec00: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
ec10: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
ec20: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ec30: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ec40: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
ec50: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
ec60: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
ec70: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
ec80: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
ec90: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
eca0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
ecb0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
ecc0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
ecd0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
ece0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
ecf0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ed00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ed10: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
ed20: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
ed30: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
ed40: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
ed50: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
ed60: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
ed70: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
ed80: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
ed90: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
eda0: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
edb0: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
edc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
edd0: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
ede0: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
edf0: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
ee00: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
ee10: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
ee20: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
ee30: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
ee40: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ee50: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
ee60: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
ee70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ee80: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
ee90: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
eea0: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
eeb0: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
eec0: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
eed0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
eee0: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
eef0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
ef00: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
ef10: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
ef20: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
ef30: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
ef40: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
ef50: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
ef60: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
ef70: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
ef80: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
ef90: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
efa0: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
efb0: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
efc0: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
efd0: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
efe0: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
eff0: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
f000: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
f010: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
f020: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
f030: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
f040: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
f050: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
f060: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
f070: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
f080: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
f090: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
f0a0: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
f0b0: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
f0c0: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
f0d0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
f0e0: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
f0f0: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
f100: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
f110: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
f120: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
f130: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
f140: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
f150: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
f160: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
f170: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
f180: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
f190: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
f1a0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
f1b0: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
f1c0: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
f1d0: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
f1e0: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
f1f0: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
f200: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
f210: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
f220: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
f230: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
f240: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
f250: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f260: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
f270: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
f280: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
f290: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
f2a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f2b0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
f2c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f2d0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
f2e0: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
f2f0: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
f300: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
f310: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f320: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
f330: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
f340: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
f350: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
f360: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
f370: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f380: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
f390: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
f3a0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
f3b0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
f3c0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
f3d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
f3e0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
f3f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
f400: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
f410: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
f420: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
f430: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
f440: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
f450: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
f460: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
f470: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
f480: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
f490: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
f4a0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
f4b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f4c0: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
f4d0: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
f4e0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
f4f0: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
f500: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
f510: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
f520: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
f530: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
f540: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
f550: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
f560: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
f570: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
f580: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
f590: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
f5a0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
f5b0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
f5c0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
f5d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f5e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
f5f0: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
f600: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
f610: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f620: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
f630: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
f640: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
f650: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
f660: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f670: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f680: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f690: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f6a0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f6b0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f6c0: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f6d0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f6e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f6f0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f700: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f720: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f730: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f740: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f760: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f780: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f790: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f7a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f7b0: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f7c0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f7d0: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f800: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f810: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f820: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f850: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f860: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f870: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f880: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f890: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f8a0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f8c0: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
f8d0: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
f8e0: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
f8f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
f900: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
f910: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
f920: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
f930: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
f940: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
f950: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f960: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
f970: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
f980: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
f990: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
f9a0: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
f9b0: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
f9c0: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
f9d0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
f9e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
f9f0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
fa00: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
fa10: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
fa20: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
fa30: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
fa40: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
fa50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fa60: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
fa70: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
fa80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
fa90: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
faa0: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
fab0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fac0: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
fad0: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
fae0: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
faf0: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
fb00: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
fb10: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
fb20: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
fb30: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
fb40: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
fb50: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fb60: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
fb70: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
fb80: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
fb90: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
fba0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
fbb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fbc0: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
fbd0: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
fbe0: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
fbf0: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
fc00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fc10: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
fc20: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
fc30: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
fc40: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
fc50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
fc60: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fc70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fc80: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
fc90: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
fca0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
fcb0: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
fcc0: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
fcd0: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
fce0: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
fcf0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
fd00: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
fd10: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
fd20: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
fd30: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
fd40: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
fd50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
fd60: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fd70: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fd80: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
fd90: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
fda0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fdb0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fdc0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
fdd0: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
fde0: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
fdf0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fe00: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fe10: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
fe20: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
fe30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
fe40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
fe50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
fe60: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
fe70: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
fe80: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
fe90: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
fea0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
feb0: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
fec0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
fed0: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
fee0: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
fef0: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
ff00: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
ff10: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
ff20: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
ff30: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
ff40: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
ff50: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
ff60: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
ff70: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
ff80: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
ff90: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
ffa0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ffb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ffc0: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
ffd0: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
ffe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fff0: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
10000 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
10010 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
10020 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
10030 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
10040 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
10050 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
10060 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
10070 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
10080 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
10090 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
100a0 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
100b0 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
100c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
100d0 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
100e0 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
100f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10100 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
10110 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
10120 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
10130 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10140 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
10150 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
10160 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
10170 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
10180 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
10190 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
101a0 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
101b0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
101c0 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
101d0 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
101e0 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
101f0 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
10200 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
10210 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
10220 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
10230 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
10240 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
10250 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
10260 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
10270 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
10280 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
10290 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
102a0 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
102b0 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
102c0 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
102d0 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
102e0 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
102f0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
10300 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
10310 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
10320 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
10330 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10340 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
10350 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
10360 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
10370 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
10380 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
10390 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
103a0 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
103b0 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
103c0 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
103d0 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
103e0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
103f0 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
10400 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10410 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10420 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
10430 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
10440 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10450 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
10460 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
10470 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
10480 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
10490 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
104a0 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
104b0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
104c0 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
104d0 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
104e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
104f0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10500 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
10510 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
10520 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
10530 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
10540 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
10550 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
10560 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10570 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
10580 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10590 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
105a0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
105b0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
105c0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
105d0 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
105e0 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
105f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
10600 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
10610 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
10620 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
10630 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
10640 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
10650 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
10660 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10670 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10680 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10690 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
106a0 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
106b0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
106c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
106d0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
106e0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
106f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10700 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
10710 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
10720 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
10730 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10740 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
10750 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
10760 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10770 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10780 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10790 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
107a0 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
107b0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
107c0 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
107d0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
107e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
107f0 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10800 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
10810 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
10820 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
10830 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
10840 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
10850 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
10860 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10870 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10880 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10890 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
108a0 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
108b0 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
108c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
108d0 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
108e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
108f0 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10900 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
10910 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
10920 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
10930 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
10940 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
10950 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
10960 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10970 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10980 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10990 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
109a0 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
109b0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
109c0 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
109d0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
109e0 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
109f0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10a00 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
10a10 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
10a20 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
10a30 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
10a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10a50 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
10a60 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10a70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10a80 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10ab0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10ac0 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
10af0 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10b00 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
10b30 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
10b40 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
10b50 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
10b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10b70 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10b80 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10b90 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
10bc0 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10bd0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
10be0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
10bf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10c00 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
10c10 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
10c20 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
10c30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10c40 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10c50 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
10c60 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
10c70 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20  er->jfd).  ){.  
10c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10c90 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
10ca0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
10cb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10cc0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
10cd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10ce0 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
10cf0 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
10d00 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
10d10 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
10d20 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
10d30 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
10d40 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
10d50 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
10d60 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
10d70 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
10d80 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
10d90 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
10da0 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
10db0 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
10dc0 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
10dd0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10de0 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
10df0 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
10e00 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
10e10 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
10e20 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
10e30 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
10e40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
10e50 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
10e60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10e70 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
10e80 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
10e90 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
10ea0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10eb0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
10ec0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10ed0 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
10ee0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10ef0 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
10f00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
10f10 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
10f20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
10f30 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
10f40 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10f50 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10f60 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
10f70 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
10f80 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
10f90 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
10fa0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
10fb0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
10fc0 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
10fd0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10fe0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10ff0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11000 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
11010 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
11020 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11030 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11040 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11050 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
11060 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
11070 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
11080 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
11090 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
110a0 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 8,.           
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b        iHdrOff+4+
110d0 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
110e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
110f0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
11100 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
11110 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
11120 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11130 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
11140 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
11150 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
11160 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
11170 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
11180 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11190 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
111a0 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
111b0 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
111c0 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
111d0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
111e0 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
111f0 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
11200 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
11210 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
11220 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
11230 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
11240 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
11250 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
11260 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
11270 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
11280 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
11290 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
112a0 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
112b0 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
112c0 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
112d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
112e0 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
112f0 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
11300 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
11310 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
11320 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
11330 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
11340 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
11350 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
11360 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
11370 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
11380 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
11390 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
113a0 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
113b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
113c0 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
113d0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
113e0 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
113f0 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
11400 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11410 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
11420 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
11430 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
11440 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11450 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
11460 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
11470 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11480 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
114a0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61   the pPager->iDa
114b0 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a  taVersion value.
114c0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61  */.u32 sqlite3Pa
114d0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50  gerDataVersion(P
114e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
114f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11500 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
11510 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  EN );.  return p
11520 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11530 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ion;.}../*.** Fr
11540 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11550 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11560 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11570 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11580 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11590 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
115a0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
115b0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
115c0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
115d0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
115e0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
115f0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11610 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11620 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11630 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11650 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11660 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11670 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11680 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11690 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
116a0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
116b0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
116c0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
116d0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
116e0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
116f0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11700 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11710 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
11720 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a  emory(pPager->sj
11730 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fd) ){.    sqlit
11740 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11750 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->sjfd);.  }.  s
11760 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
11770 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b  er->aSavepoint);
11780 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  .  pPager->aSave
11790 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
117a0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
117b0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
117c0 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  SubRec = 0;.}../
117d0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
117e0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
117f0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
11800 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
11810 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61  .** bitvecs of a
11820 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
11830 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ts. Return SQLIT
11840 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
11850 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ul.** or SQLITE_
11860 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
11870 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
11880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11890 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
118a0 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
118b0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
118c0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
118e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
118f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11900 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
11910 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
11920 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
11930 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11940 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
11950 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
11960 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
11970 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
11980 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
11990 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
119a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
119b0 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
119c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74  , pgno);.      t
119d0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
119e0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
119f0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
11a00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
11a10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11a20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11a30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11a40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11a50 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
11a60 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
11a70 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e  usive mode and n
11a80 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52  ot.** in the ERR
11a90 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
11aa0 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73  ise, it switches
11ab0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41   the pager to PA
11ac0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74  GER_OPEN.** stat
11ad0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
11ae0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11af0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
11b00 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62   mode, the datab
11b10 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  ase file is.** c
11b20 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b  ompletely unlock
11b30 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  ed. If the file 
11b40 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20  is unlocked and 
11b50 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11b60 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69  does.** not exhi
11b70 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41  bit the UNDELETA
11b80 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72  BLE_WHEN_OPEN pr
11b90 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72  operty, the jour
11ba0 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  nal file is.** c
11bb0 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20  losed (if it is 
11bc0 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  open)..**.** If 
11bd0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11be0 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
11bf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11c00 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a  s called, the .*
11c10 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
11c20 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72  e pager cache ar
11c30 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f  e discarded befo
11c40 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63  re switching bac
11c50 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45  k to .** the OPE
11c60 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c  N state. Regardl
11c70 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
11c80 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11c90 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a  xclusive-mode.**
11ca0 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75   or not, any jou
11cb0 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69  rnal file left i
11cc0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
11cd0 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65  m will be treate
11ce0 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f  d.** as a hot-jo
11cf0 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
11d00 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74   back the next t
11d10 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73  ime a read-trans
11d20 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65  action.** is ope
11d30 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20  ned (by this or 
11d40 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e  by any other con
11d50 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61  nection)..*/.sta
11d60 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
11d70 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
11d80 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  ger){..  assert(
11d90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11da0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
11db0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
11dc0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
11dd0 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  PEN .       || p
11de0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11df0 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b  AGER_ERROR .  );
11e00 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
11e10 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11e20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
11e30 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11e40 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  al = 0;.  releas
11e50 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
11e60 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
11e70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
11e80 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
11e90 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
11ea0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71  ->jfd) );.    sq
11eb0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
11ec0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
11ed0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50  r->pWal);.    pP
11ee0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
11ef0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGER_OPEN;.  }el
11f00 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
11f10 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
11f20 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
11f50 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67   returned by pag
11f60 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a  erUnlockDb() */.
11f70 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73      int iDc = is
11f80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
11f90 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  ?sqlite3OsDevice
11fa0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
11fb0 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a  pPager->fd):0;..
11fc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
11fd0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73  erating system s
11fe0 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20  upport deletion 
11ff0 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74  of open files, t
12000 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65  hen.    ** close
12010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12020 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
12030 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
12040 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  k.  Otherwise.  
12050 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e    ** another con
12060 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
12070 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
12080 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68   might delete th
12090 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75  e file.    ** ou
120a0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
120b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
120c0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
120d0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
120e0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
120f0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12100 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
12110 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12120 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12130 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
12140 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
12150 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12160 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12170 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31  DELETE   & 5)!=1
12180 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12190 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
121a0 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29  DE_TRUNCATE & 5)
121b0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
121c0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
121d0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26  LMODE_PERSIST  &
121e0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66   5)==1 );.    if
121f0 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49  ( 0==(iDc & SQLI
12200 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
12210 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a  ABLE_WHEN_OPEN).
12220 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67       || 1!=(pPag
12230 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
12240 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  & 5).    ){.    
12250 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12260 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
12270 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12280 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12290 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
122a0 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  and the call to 
122b0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
122c0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
122d0 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63  fails, set the c
122e0 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55  urrent lock to U
122f0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
12300 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20   the comment.   
12310 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64   ** above the #d
12320 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57  efine for UNKNOW
12330 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
12340 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79  planation of why
12350 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   this.    ** is 
12360 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
12370 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
12380 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
12390 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
123a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
123b0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
123c0 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
123d0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
123e0 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e  >eLock = UNKNOWN
123f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  _LOCK;.    }..  
12400 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73    /* The pager s
12410 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e  tate may be chan
12420 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45  ged from PAGER_E
12430 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50  RROR to PAGER_OP
12440 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77  EN here.    ** w
12450 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20  ithout clearing 
12460 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  the error code. 
12470 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f  This is intentio
12480 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a  nal - the error.
12490 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63      ** code is c
124a0 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63  leared and the c
124b0 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68  ache reset in th
124c0 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20  e block below.. 
124d0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
124e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
124f0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
12500 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
12510 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
12520 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12530 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
12540 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12550 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OPEN;.  }..  /* 
12560 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
12570 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
12580 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12590 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
125a0 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  be.  ** trusted.
125b0 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20   Now that there 
125c0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
125d0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
125e0 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a   the pager,.  **
125f0 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d   it can safely m
12600 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ove back to PAGE
12610 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68  R_OPEN state. Th
12620 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f  is happens in bo
12630 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61  th.  ** normal a
12640 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  nd exclusive-loc
12650 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2a 0a  king mode..  **.
12660 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
12670 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  There is no way 
12680 6f 75 74 20 6f 66 20 74 68 65 20 65 72 72 6f 72  out of the error
12690 20 73 74 61 74 65 20 66 6f 72 20 74 65 6d 70 20   state for temp 
126a0 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 54 68 69 73  files..  ** This
126b0 20 69 73 20 62 65 63 61 75 73 65 20 69 74 20 69   is because it i
126c0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
126d0 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 72 65 73  o call pager_res
126e0 65 74 28 29 20 6f 6e 20 61 20 74 65 6d 70 0a 20  et() on a temp. 
126f0 20 2a 2a 20 66 69 6c 65 20 70 61 67 65 72 20 28   ** file pager (
12700 61 73 20 74 68 69 73 20 6d 61 79 20 64 69 73 63  as this may disc
12710 61 72 64 20 74 68 65 20 6f 6e 6c 79 20 63 6f 70  ard the only cop
12720 79 20 6f 66 20 73 6f 6d 65 20 64 61 74 61 29 2e  y of some data).
12730 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12740 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12750 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12760 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
12770 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12780 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12790 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  tempFile==0 ){. 
127a0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
127b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
127c0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
127d0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
127e0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
127f0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12810 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12820 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  = (isOpen(pPager
12830 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f  ->jfd) ? PAGER_O
12840 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44  PEN : PAGER_READ
12850 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
12860 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
12870 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
12880 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
12890 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  d, 0, 0);.    pP
128a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
128b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
128c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
128d0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
128e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
128f0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
12900 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
12910 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12920 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12930 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12940 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12950 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12960 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12970 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12980 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12990 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
129a0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
129b0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
129c0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
129d0 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
129e0 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
129f0 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12a00 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12a10 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12a20 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12a30 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12a40 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12a50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12a60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12a70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12a80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12a90 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12aa0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12ab0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12ac0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12ad0 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12ae0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12af0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12b00 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12b10 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12b20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12b30 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12b40 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12b50 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12b60 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12b70 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12b80 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12b90 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12ba0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12bb0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12bc0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12bd0 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12be0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12bf0 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12c00 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12c10 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12c20 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12c30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12c40 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12c60 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12c70 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12c80 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12c90 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12ca0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12cb0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12cc0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12cd0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12cf0 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12d00 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12d20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12d30 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12d40 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12d50 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12d60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12d70 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12d80 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12d90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12da0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12db0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12dc0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12dd0 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12de0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12df0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12e00 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12e10 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12e20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12e30 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12e40 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12e50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12e60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12e70 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12e80 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12e90 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12ea0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12eb0 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12ec0 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74 65 20 74  *.** The write t
12ed0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
12ee0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 70 61 73  on the pager pas
12ef0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
12f00 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 62  argument is.** b
12f10 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
12f20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
12f30 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 61 6c  turns true if al
12f40 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 73 68  l dirty pages sh
12f50 6f 75 6c 64 0a 2a 2a 20 62 65 20 66 6c 75 73 68  ould.** be flush
12f60 65 64 20 74 6f 20 64 69 73 6b 2c 20 6f 72 20 66  ed to disk, or f
12f70 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
12f80 50 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20  Pages should be 
12f90 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 0a  flushed to disk.
12fa0 2a 2a 20 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66  ** unless one of
12fb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
12fc0 73 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  s true:.**.**   
12fd0 2a 20 54 68 65 20 64 62 20 69 73 20 61 6e 20 69  * The db is an i
12fe0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12ff0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  e..**.**   * The
13000 20 64 62 20 69 73 20 61 20 74 65 6d 70 6f 72 61   db is a tempora
13010 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
13020 74 68 65 20 64 62 20 66 69 6c 65 20 68 61 73 20  the db file has 
13030 6e 6f 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  not been opened.
13040 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
13050 62 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  b is a temporary
13060 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
13070 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
13080 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 20 20   less than.**   
13090 20 20 43 2f 34 20 64 69 72 74 79 20 70 61 67 65    C/4 dirty page
130a0 73 2c 20 77 68 65 72 65 20 43 20 69 73 20 74 68  s, where C is th
130b0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 63 61 63  e configured cac
130c0 68 65 2d 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  he-size..*/.stat
130d0 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73  ic int pagerFlus
130e0 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  hOnCommit(Pager 
130f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
13100 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13110 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
13120 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
13130 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75  ager->fd) ) retu
13140 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 28  rn 0;.  return (
13150 73 71 6c 69 74 65 33 50 43 61 63 68 65 50 65 72  sqlite3PCachePer
13160 63 65 6e 74 44 69 72 74 79 28 70 50 61 67 65 72  centDirty(pPager
13170 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35 29 3b  ->pPCache)>=25);
13180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
13190 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
131a0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
131b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
131c0 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
131d0 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
131e0 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
131f0 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
13200 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
13210 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
13220 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
13230 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
13240 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
13250 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
13260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13270 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
13280 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
13290 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
132a0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
132b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
132c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
132d0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
132e0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
132f0 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
13300 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
13310 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
13320 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
13330 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
13340 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
13350 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
13360 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
13370 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
13380 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
13390 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
133a0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
133b0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
133c0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
133d0 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
133e0 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
133f0 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
13400 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
13410 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
13420 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
13430 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
13440 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
13450 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
13460 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
13470 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
13480 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
13490 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
134a0 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
134b0 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
134c0 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
134d0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
134e0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
134f0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13500 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13510 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13520 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
13530 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
13540 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
13550 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
13560 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13570 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
13580 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
13590 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
135a0 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
135b0 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
135c0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
135d0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
135e0 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
135f0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13600 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13610 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13620 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
13630 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13640 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
13650 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
13660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13670 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
13680 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
13690 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
136a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
136b0 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
136c0 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
136d0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
136e0 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
136f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13700 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13710 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13720 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
13730 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
13740 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
13750 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
13760 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
13770 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
13780 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
13790 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
137a0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
137b0 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
137c0 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
137d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
137e0 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
137f0 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13800 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13810 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13820 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
13830 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13840 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
13850 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
13860 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13870 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
13880 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
13890 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
138a0 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
138b0 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
138c0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
138d0 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
138e0 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
138f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13900 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13910 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13920 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
13930 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13940 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13950 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
13960 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
13970 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
13980 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
13990 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
139a0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
139b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
139c0 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
139d0 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
139e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
139f0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13a00 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13a10 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13a20 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13a30 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
13a40 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
13a50 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
13a60 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
13a70 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
13a80 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13a90 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
13aa0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
13ab0 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
13ac0 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
13ad0 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13ae0 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13af0 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13b00 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13b10 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13b20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
13b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13b40 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
13b50 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
13b60 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
13b70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
13b80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13b90 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
13ba0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
13bb0 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
13bc0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
13bd0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13be0 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13bf0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13c00 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13c10 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13c20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
13c30 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
13c40 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
13c50 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
13c60 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
13c70 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13c80 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
13c90 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
13ca0 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
13cb0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
13cc0 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
13cd0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13ce0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13cf0 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13d00 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13d10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13d20 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
13d30 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
13d40 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
13d50 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
13d60 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
13d70 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
13d80 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
13d90 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
13da0 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
13db0 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
13dc0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
13dd0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13de0 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13df0 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13e00 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13e10 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13e20 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
13e30 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
13e40 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
13e50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13e60 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
13e70 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
13e80 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
13e90 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
13ea0 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
13eb0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
13ec0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
13ed0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13ee0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13f00 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13f10 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13f20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13f30 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13f40 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13f50 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13f60 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13f80 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13f90 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13fa0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13fb0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13fc0 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13fd0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13fe0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13ff0 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
14000 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
14010 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
14020 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
14030 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
14040 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
14050 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
14060 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  ry(pPager->jfd) 
14070 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  ){.      /* asse
14080 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14090 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
140a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
140b0 59 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71  Y ); */.      sq
140c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
140d0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
140e0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
140f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14100 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14110 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
14120 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
14130 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
14140 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14150 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
14160 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
14170 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
14180 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
14190 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
141a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
141b0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
141c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
141d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
141e0 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73  new file size is
141f0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
14200 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77  e inode right aw
14210 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ay..          **
14220 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a   Otherwise the j
14230 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73  ournal might res
14240 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67  urrect following
14250 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e   a power loss an
14260 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
14270 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72  ause the last tr
14280 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c  ansaction to rol
14290 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20  l back.  See.   
142a0 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a         ** https:
142b0 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c  //bugzilla.mozil
142c0 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e  la.org/show_bug.
142d0 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20  cgi?id=1072773. 
142e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
142f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14300 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
14310 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
14320 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
14330 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14340 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14350 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
14360 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
14370 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14380 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
14390 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
143a0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
143b0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
143c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
143d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
143e0 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
143f0 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
14400 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
14410 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
14420 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14430 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
14440 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
14450 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
14460 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
14470 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
14480 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
14490 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
144a0 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
144b0 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
144c0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
144d0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
144e0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
144f0 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
14500 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14510 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
14520 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14530 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
14540 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
14550 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
14560 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14570 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50  nt bDelete = !pP
14580 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
14590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
145a0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
145b0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
145c0 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  fd)==0 );.      
145d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
145e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
145f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
14600 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20  ELETE .         
14610 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14620 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14630 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
14640 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  RY .           |
14650 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14660 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14670 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
14680 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
14690 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
146a0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
146b0 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20  if( bDelete ){. 
146c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
146d0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
146e0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
146f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
14700 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a  er->extraSync);.
14710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14720 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
14730 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73  _CHECK_PAGES.  s
14740 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
14750 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
14760 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
14770 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20  set_pagehash);. 
14780 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
14790 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ize==0 && sqlite
147a0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
147b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
147c0 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
147d0 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  *p = sqlite3Page
147e0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
147f0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  1);.    if( p ){
14800 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61  .      p->pageHa
14810 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  sh = 0;.      sq
14820 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
14830 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d  otNull(p);.    }
14840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
14850 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
14860 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
14870 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
14880 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
14890 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
148a0 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 4d 45 4d  c = 0;.  if( MEM
148b0 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68  DB || pagerFlush
148c0 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  OnCommit(pPager)
148d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
148e0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
148f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
14900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
14910 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 57  ite3PcacheClearW
14920 72 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e  ritable(pPager->
14930 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20 20  pPCache);.  }.  
14940 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
14950 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
14960 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
14970 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70  bSize);..  if( p
14980 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
14990 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f  r) ){.    /* Dro
149a0 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d  p the WAL write-
149b0 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c  lock, if any. Al
149c0 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65  so, if the conne
149d0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20  ction was in .  
149e0 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64    ** locking_mod
149f0 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
14a00 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   but is no longe
14a10 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c  r, drop the EXCL
14a20 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f  USIVE .    ** lo
14a30 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  ck held on the d
14a40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
14a50 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73    */.    rc2 = s
14a60 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74  qlite3WalEndWrit
14a70 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
14a80 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
14a90 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c  assert( rc2==SQL
14aa0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73  ITE_OK );.  }els
14ab0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
14ac0 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14ad0 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  & pPager->dbFile
14ae0 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53  Size>pPager->dbS
14af0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ize ){.    /* Th
14b00 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
14b10 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  en when committi
14b20 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
14b30 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75   in rollback-jou
14b40 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  rnal.    ** mode
14b50 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
14b60 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
14b70 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
14b80 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
14b90 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20  .    ** At this 
14ba0 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  point the journa
14bb0 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  l has been final
14bc0 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61  ized and the tra
14bd0 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  nsaction .    **
14be0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
14bf0 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65  mmitted, but the
14c00 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
14c10 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
14c20 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65   the.    ** file
14c30 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20  . So it is safe 
14c40 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
14c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
14c60 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   its minimum.   
14c70 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a   ** required siz
14c80 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
14c90 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
14ca0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
14cb0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
14cc0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14cd0 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
14ce0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ze);.  }..  if( 
14cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14d00 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70   bCommit && isOp
14d10 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
14d20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14d30 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
14d40 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
14d50 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f  TE_FCNTL_COMMIT_
14d60 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20  PHASETWO, 0);.  
14d70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14d80 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
14d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14da0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
14db0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
14dc0 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57    && (!pagerUseW
14dd0 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71  al(pPager) || sq
14de0 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
14df0 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
14e00 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20  al, 0)).  ){.   
14e10 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f   rc2 = pagerUnlo
14e20 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
14e30 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
14e40 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
14e50 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
14e60 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
14e70 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
14e80 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
14e90 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74  ster = 0;..  ret
14ea0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
14eb0 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
14ec0 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
14ed0 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
14ee0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
14ef0 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
14f00 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
14f10 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
14f20 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
14f30 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
14f40 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f   ERROR state, do
14f50 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
14f60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
14f70 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
14f80 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
14f90 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
14fa0 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
14fb0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
14fc0 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
14fd0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
14fe0 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
14ff0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
15000 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61  ove the pager ba
15010 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
15020 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65  . If this .** me
15030 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ans that there i
15040 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
15050 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
15060 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
15070 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  t .** connection
15080 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
15090 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
150a0 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
150b0 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a   be this one) .*
150c0 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62  * will roll it b
150d0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
150e0 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
150f0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
15100 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
15110 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
15120 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
15130 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
15140 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
15150 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
15160 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
15170 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
15180 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63  RROR state. Whic
15190 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
151a0 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
151b0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
151c0 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
151d0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
151e0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
151f0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
15200 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
15210 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
15220 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
15230 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
15240 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e!=PAGER_OPEN ){
15250 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
15260 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
15270 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69  pPager) );.    i
15280 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
15290 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
152a0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
152b0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
152c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
152d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
152e0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
152f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
15300 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
15310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
15320 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
15330 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Mode ){.      as
15340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15350 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
15360 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ER );.      page
15370 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
15380 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  n(pPager, 0, 0);
15390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
153a0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
153b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
153c0 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
153d0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
153e0 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
153f0 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
15400 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
15410 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
15420 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
15430 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
15440 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
15450 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
15460 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
15470 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
15480 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
15490 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
154a0 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
154b0 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
154c0 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
154d0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
154e0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
154f0 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
15500 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
15510 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
15520 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
15530 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
15540 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
15550 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
15560 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
15570 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
15580 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
15590 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
155a0 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
155b0 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
155c0 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
155d0 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
155e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
155f0 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
15600 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
15610 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
15620 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
15630 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
15640 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
15650 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
15660 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
15670 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
15680 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
15690 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
156a0 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
156b0 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
156c0 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
156d0 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
156e0 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
156f0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
15700 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
15710 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
15720 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
15730 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
15740 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
15750 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
15760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
15770 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
15780 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
15790 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
157a0 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
157b0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
157c0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
157d0 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
157e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
157f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
15800 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
15810 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15820 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
15830 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
15840 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
15850 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
15860 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
15870 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
15880 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
15890 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
158a0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
158b0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
158c0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
158d0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
158e0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
158f0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
15900 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
15910 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
15920 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
15930 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15940 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
15950 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
15960 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
15990 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
159a0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
159b0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
159c0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
159d0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
159e0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
159f0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
15a00 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
15a10 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
15a20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
15a30 65 72 76 65 64 20 62 69 74 73 20 69 73 20 74 68  erved bits is th
15a40 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65  e same in the de
15a50 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67  stination.** pag
15a60 65 72 20 61 73 20 69 74 20 69 73 20 69 6e 20 74  er as it is in t
15a70 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73  he source.  This
15a80 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61   comes up when a
15a90 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20   VACUUM changes 
15aa0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
15ab0 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20 74   reserved bits t
15ac0 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20  o the "optimal" 
15ad0 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  amount..*/.void 
15ae0 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67  sqlite3PagerAlig
15af0 6e 52 65 73 65 72 76 65 28 50 61 67 65 72 20 2a  nReserve(Pager *
15b00 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53  pDest, Pager *pS
15b10 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74  rc){.  if( pDest
15b20 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63  ->nReserve!=pSrc
15b30 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20  ->nReserve ){.  
15b40 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76    pDest->nReserv
15b50 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72  e = pSrc->nReser
15b60 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
15b70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a  ortSize(pDest);.
15b80 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
15b90 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
15ba0 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
15bb0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
15bc0 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
15bd0 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
15be0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
15bf0 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
15c00 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
15c10 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
15c20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
15c30 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
15c40 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
15c50 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
15c60 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
15c70 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
15c80 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
15c90 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
15ca0 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
15cb0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
15cc0 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
15cd0 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
15ce0 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
15cf0 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
15d00 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15d10 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
15d20 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
15d30 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15d40 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
15d50 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15d60 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
15d70 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
15d80 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
15d90 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
15da0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15dc0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
15dd0 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
15de0 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
15df0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
15e00 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15e10 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
15e20 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
15e30 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15e40 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
15e50 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15e60 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
15e70 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
15e80 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
15e90 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
15ea0 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
15eb0 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15ec0 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
15ed0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
15ee0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
15ef0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15f00 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
15f10 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15f20 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15f30 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
15f40 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
15f50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15f60 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
15f70 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
15f80 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
15f90 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
15fa0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
15fb0 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15fc0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
15fd0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
15fe0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
15ff0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
16000 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
16010 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
16020 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
16030 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
16040 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
16050 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
16060 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
16070 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
16080 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
16090 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
160a0 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
160b0 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
160c0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
160d0 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
160e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
160f0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
16100 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
16110 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
16120 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
16130 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
16140 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
16150 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
16160 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
16170 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
16180 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
16190 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
161a0 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
161b0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
161c0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
161d0 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
161e0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
161f0 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
16200 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
16210 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
16220 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
16230 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
16240 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
16250 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
16260 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
16270 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
16280 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16290 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
162a0 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
162b0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
162c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
162d0 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
162e0 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
162f0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
16300 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
16310 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
16320 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
16330 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
16340 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
16350 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
16360 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
16370 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
16380 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
16390 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
163a0 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
163b0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
163c0 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
163e0 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
163f0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
16400 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
16410 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16430 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
16440 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
16450 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
16480 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
16490 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
164a0 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
164c0 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
164d0 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
164e0 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
164f0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
16500 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
16510 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
16520 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
16530 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
16540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16550 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16560 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
16570 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
16580 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
16590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
165a0 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
165b0 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
165c0 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
165d0 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
165e0 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
165f0 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
16600 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
16610 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
16620 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
16630 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
16640 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
16650 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
16660 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
16670 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
16680 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
16690 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
166a0 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
166b0 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
166c0 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
166d0 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
166e0 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
166f0 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
16700 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
16710 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
16720 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
16730 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
16740 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
16750 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16760 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
16770 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
16780 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
16790 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
167a0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
167b0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
167c0 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
167d0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
167e0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
167f0 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
16800 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
16810 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
16820 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
16830 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
16840 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
16850 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
16860 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
16870 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
16880 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
16890 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
168a0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
168b0 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
168c0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
168d0 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
168e0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
168f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16900 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16910 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
16920 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
16930 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
16940 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
16950 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16960 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
16970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
16980 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16990 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
169a0 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
169b0 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
169c0 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
169d0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
169e0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
169f0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
16a00 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
16a10 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
16a20 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
16a30 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
16a40 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
16a50 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
16a60 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
16a70 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
16a80 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
16a90 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
16aa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
16ac0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16ad0 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
16ae0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16af0 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
16b00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16b10 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16b20 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
16b30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16b40 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
16b50 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
16b60 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
16b70 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
16b80 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
16b90 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
16ba0 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
16bb0 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
16bc0 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
16bd0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
16be0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
16bf0 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
16c00 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
16c10 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
16c20 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
16c30 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
16c40 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
16c50 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
16c60 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
16c70 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
16c80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
16c90 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
16ca0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
16cb0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
16cc0 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
16cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16ce0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
16cf0 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
16d00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
16d10 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
16d20 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
16d30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16d40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16d50 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
16d60 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
16d70 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
16d80 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
16d90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
16da0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
16db0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16dc0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
16dd0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
16de0 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
16df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16e00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16e10 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
16e20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16e30 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f  played back befo
16e40 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
16e50 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
16e60 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
16e70 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
16e80 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
16e90 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
16ea0 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
16eb0 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
16ec0 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
16ed0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
16ee0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
16ef0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
16f00 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
16f10 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
16f20 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
16f30 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
16f40 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
16f50 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
16f60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
16f70 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
16f80 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
16f90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
16fa0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
16fb0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
16fc0 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
16fd0 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
16fe0 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
16ff0 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
17000 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17010 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
17020 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
17030 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
17040 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
17050 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
17060 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
17070 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
17080 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
17090 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
170a0 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
170b0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
170c0 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
170d0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
170e0 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
170f0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
17100 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
17110 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
17120 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
17130 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
17140 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
17150 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
17160 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
17170 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
17180 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
17190 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
171a0 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
171b0 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
171c0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
171d0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
171e0 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
171f0 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
17200 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
17210 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
17220 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
17230 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
17240 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
17250 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
17260 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
17270 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
17280 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
17290 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
172a0 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
172b0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
172c0 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
172d0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
172e0 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
172f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
17300 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
17310 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
17320 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
17330 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
17340 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
17350 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
17360 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
17370 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
17380 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
17390 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
173a0 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
173b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
173c0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
173d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
173e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
173f0 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
17400 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
17410 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
17420 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
17430 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
17440 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
17450 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
17460 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
17470 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
17480 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
17490 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
174a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
174b0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
174c0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
174d0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
174e0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
174f0 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
17500 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
17510 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
17520 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
17530 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
17540 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
17550 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
17560 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
17570 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
17580 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
17590 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
175a0 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
175b0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
175c0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
175d0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
175e0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
175f0 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
17600 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
17610 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
17620 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
17630 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
17640 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
17650 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
17660 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
17670 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
17680 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
17690 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
176a0 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
176b0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
176c0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
176d0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
176e0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
176f0 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
17700 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
17710 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
17720 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
17730 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
17740 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
17750 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
17760 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
17770 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
17780 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
17790 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
177a0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
177b0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
177c0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
177d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
177e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
177f0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
17800 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  {.    pPg = sqli
17810 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
17820 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
17830 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20  }.  assert( pPg 
17840 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
17850 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17860 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
17870 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20 70  N || pPg==0 || p
17880 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
17890 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
178a0 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
178b0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
178c0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
178d0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
178e0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
178f0 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
17900 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
17910 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
17920 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
17930 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
17940 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
17950 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
17960 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
17970 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
17980 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
17990 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
179a0 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
179b0 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
179c0 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
179d0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
179e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
179f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
17a00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
17a10 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
17a20 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
17a30 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
17a40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
17a50 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
17a60 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
17a70 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
17a80 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
17a90 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
17aa0 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
17ab0 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
17ac0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
17ad0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
17ae0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
17af0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
17b00 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
17b10 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
17b20 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
17b30 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
17b40 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
17b50 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
17b60 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17b70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17b80 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
17b90 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
17ba0 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
17bb0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
17bc0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
17bd0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
17be0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
17bf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
17c00 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
17c10 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
17c20 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
17c30 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
17c40 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17c50 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
17c60 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61  OMEM_BKPT, aData
17c70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
17c80 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
17c90 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
17ca0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17cb0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
17cc0 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
17cd0 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
17ce0 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
17cf0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
17d00 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17d10 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
17d20 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
17d30 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
17d40 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
17d50 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
17d60 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
17d70 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
17d80 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
17d90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
17da0 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
17db0 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
17dc0 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
17dd0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
17de0 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
17df0 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
17e00 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
17e10 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
17e20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
17e30 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
17e40 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
17e50 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
17e60 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
17e70 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
17e80 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
17e90 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17ea0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
17eb0 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
17ec0 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
17ed0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
17ee0 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
17ef0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
17f00 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
17f10 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
17f20 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
17f30 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
17f40 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
17f50 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
17f60 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
17f70 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
17f80 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
17f90 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
17fa0 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
17fb0 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
17fc0 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
17fd0 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
17fe0 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
17ff0 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
18000 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
18010 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
18020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
18030 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18040 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
18050 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
18060 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
18070 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
18080 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
18090 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
180a0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
180b0 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  o, &pPg, 1);.   
180c0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
180d0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
180e0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
180f0 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)!=0 );.    pPa
18100 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18110 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  &= ~SPILLFLAG_RO
18120 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20  LLBACK;.    if( 
18130 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
18150 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
18160 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
18170 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
18180 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
18190 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
181a0 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
181b0 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
181c0 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
181d0 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
181e0 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
181f0 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
18200 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
18210 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
18220 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
18230 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
18240 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
18250 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
18260 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
18270 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
18280 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
18290 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
182a0 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
182b0 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
182c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
182d0 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
182e0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
182f0 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
18300 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
18310 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
18320 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
18330 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18340 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
18350 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
18360 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
18370 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
18380 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
18390 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
183a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
183b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
183c0 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
183d0 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
183e0 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
183f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
18400 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
18410 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
18420 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
18430 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
18440 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
18450 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
18460 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
18470 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
18480 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
18490 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
184a0 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
184b0 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20  it out to the.  
184c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
184d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
184e0 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
184f0 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
18500 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70  s rule. If the p
18510 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  age is being rol
18520 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  led.      ** bac
18530 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73  k as part of a s
18540 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61  avepoint (or sta
18550 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b  tement) rollback
18560 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20   from an .      
18570 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  ** unsynced port
18580 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ion of the main 
18590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
185a0 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  en it is not saf
185b0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e.      ** to ma
185c0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
185d0 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65  lean. This is be
185e0 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68  cause marking th
185f0 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20  e page as.      
18600 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c  ** clean will cl
18610 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
18620 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69  ED_SYNC flag. Si
18630 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a  nce the page is.
18640 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
18650 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
18660 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69  file (recorded i
18670 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
18680 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  al) and.      **
18690 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
186a0 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65  SYNC flag is cle
186b0 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67  ared, if the pag
186c0 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  e is written to.
186d0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
186e0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
186f0 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  action, it will 
18700 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
18710 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  ty but.      ** 
18720 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
18730 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f  YNC flag will no
18740 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75  t be set. It cou
18750 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61  ld then potentia
18760 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  lly.      ** be 
18770 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f  written out into
18780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18790 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f  le before its jo
187a0 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
187b0 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73   ** segment is s
187c0 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73  ynced. If a cras
187d0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
187e0 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  or following thi
187f0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  s,.      ** data
18800 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
18810 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20  may ensue..     
18820 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 70 64   **.      ** Upd
18830 61 74 65 3a 20 41 6e 6f 74 68 65 72 20 65 78 63  ate: Another exc
18840 65 70 74 69 6f 6e 20 69 73 20 66 6f 72 20 74 65  eption is for te
18850 6d 70 20 66 69 6c 65 73 20 74 68 61 74 20 61 72  mp files that ar
18860 65 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20  e not .      ** 
18870 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
18880 73 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ses. In this cas
18890 65 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 68  e the page may h
188a0 61 76 65 20 62 65 65 6e 20 64 69 72 74 79 0a 20  ave been dirty. 
188b0 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 73       ** at the s
188c0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
188d0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
188e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
188f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
18900 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ger) );.      if
18910 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
18920 6c 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  le==0 ) sqlite3P
18930 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
18940 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
18950 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
18960 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
18970 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
18980 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
18990 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
189a0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
189b0 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
189c0 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
189d0 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
189e0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
189f0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
18a00 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
18a10 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
18a20 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
18a30 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
18a40 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
18a50 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
18a60 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
18a70 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
18a80 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
18a90 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18aa0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
18ab0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
18ac0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
18ad0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18ae0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
18af0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
18b00 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
18b10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
18b20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
18b30 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
18b40 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
18b50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18b60 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
18b70 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
18b80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
18b90 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
18ba0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
18bb0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18bc0 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
18bd0 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
18be0 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
18bf0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
18c00 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
18c10 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
18c20 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
18c30 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
18c40 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
18c50 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
18c60 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
18c70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
18c80 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
18c90 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
18ca0 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
18cb0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
18cc0 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
18cd0 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
18ce0 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
18cf0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
18d00 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
18d10 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
18d20 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
18d30 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
18d40 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
18d50 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
18d60 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
18d70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
18d80 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
18d90 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
18da0 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
18db0 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
18dc0 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
18dd0 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
18de0 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
18df0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
18e00 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
18e10 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
18e20 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
18e30 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
18e40 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
18e50 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
18e60 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
18e70 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
18e80 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
18e90 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
18ea0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
18eb0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
18ec0 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
18ed0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
18ee0 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
18ef0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
18f00 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
18f10 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
18f20 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18f30 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
18f40 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
18f50 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18f60 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
18f70 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
18f80 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
18f90 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
18fa0 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
18fb0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18fc0 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
18fd0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
18fe0 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
18ff0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
19000 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
19010 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
19020 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
19030 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
19040 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
19050 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
19060 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
19070 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
19080 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
19090 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
190a0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
190b0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
190c0 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
190d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
190e0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
190f0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
19100 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
19110 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
19120 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
19130 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
19140 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
19150 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19160 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
19170 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
19180 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
19190 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
191a0 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
191b0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
191c0 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
191d0 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
191e0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
191f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
19200 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19210 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
19220 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
19230 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
19240 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
19250 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
19260 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
19270 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19280 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
19290 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
192a0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
192b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
192c0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
192d0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
19300 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
19310 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
19320 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
19330 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
19340 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
19350 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
19360 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
19370 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
19380 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19390 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
193a0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
193b0 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
193c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
193d0 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
193e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
193f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
19400 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19410 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
19420 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
19430 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
19440 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
19450 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
19460 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
19470 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
19480 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
19490 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
194a0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
194b0 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
194c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
194d0 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
194e0 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
194f0 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
19500 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
19510 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
19520 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
19530 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19540 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
19550 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
19560 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19570 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
19580 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
19590 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
195a0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
195b0 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
195c0 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
195d0 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
195e0 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
195f0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
19600 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
19610 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
19620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
19630 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  M_BKPT;.  }else{
19640 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
19650 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
19660 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19670 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
19680 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
19690 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
196a0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
196b0 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
196c0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
196d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
196e0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
196f0 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
19700 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
19710 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
19720 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
19730 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
19740 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
19750 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
19760 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
19770 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
19780 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
19790 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
197a0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
197b0 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
197c0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
197d0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
197e0 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
197f0 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
19800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
19810 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
19820 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
19830 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19840 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
19850 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
19860 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
19870 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
19880 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
19890 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
198a0 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
198b0 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
198c0 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
198d0 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
198e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
198f0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  M_BKPT;.    goto
19900 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19910 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
19920 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
19930 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
19940 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
19950 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
19960 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
19970 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
19980 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
19990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
199a0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
199b0 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
199c0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
199d0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
199e0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
199f0 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
19a00 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
19a10 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
19a20 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
19a30 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
19a40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19a50 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
19a60 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
19a70 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
19a80 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
19a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19aa0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
19ab0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19ac0 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
19ad0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
19ae0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
19af0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
19b00 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19b10 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
19b20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
19b30 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
19b40 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
19b50 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
19b60 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
19b70 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
19b80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19b90 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
19ba0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
19bb0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
19bc0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
19bd0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
19be0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
19bf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19c00 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
19c10 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
19c20 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
19c30 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c50 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19c60 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19c70 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
19c80 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
19c90 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
19ca0 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
19cb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
19cc0 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
19cd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19cf0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19d00 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19d10 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
19d20 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
19d30 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
19d40 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
19d50 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
19d60 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
19d70 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
19d80 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
19d90 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19da0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
19db0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19dd0 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
19de0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
19df0 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
19e00 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
19e10 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
19e20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
19e30 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
19e40 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
19e50 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
19e60 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
19e70 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
19e80 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
19e90 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
19ea0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
19eb0 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
19ec0 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
19ed0 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
19ee0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19ef0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
19f00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
19f10 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
19f20 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
19f30 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
19f40 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
19f50 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
19f60 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
19f70 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
19f80 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
19f90 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
19fa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
19fb0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
19fc0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
19fd0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
19fe0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
19ff0 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
1a000 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
1a010 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
1a020 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
1a030 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
1a040 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1a050 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1a060 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
1a070 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
1a080 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
1a090 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
1a0a0 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
1a0b0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1a0c0 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
1a0d0 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
1a0e0 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
1a0f0 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
1a100 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
1a110 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
1a120 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
1a130 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1a140 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
1a150 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
1a160 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
1a170 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
1a180 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1a190 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
1a1a0 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
1a1b0 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
1a1c0 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
1a1d0 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
1a1e0 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
1a1f0 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
1a200 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
1a210 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
1a220 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
1a230 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
1a240 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1a250 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
1a260 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1a270 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
1a280 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1a290 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1a2a0 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
1a2b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1a2c0 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
1a2d0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
1a2e0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1a2f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
1a300 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
1a310 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1a320 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1a330 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1a340 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1a350 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
1a360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a370 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1a380 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
1a390 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1a3a0 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
1a3b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1a3c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1a3d0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1a3e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1a3f0 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
1a400 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
1a410 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
1a420 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
1a430 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
1a440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1a450 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1a460 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  CK );.    /* TOD
1a470 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
1a480 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
1a490 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
1a4a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a4b0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1a4c0 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
1a4d0 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
1a4e0 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e   = szPage*(i64)n
1a4f0 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
1a500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1a510 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
1a520 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
1a530 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
1a540 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1a550 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
1a560 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
1a570 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
1a580 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75     }else if( (cu
1a590 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65  rrentSize+szPage
1a5a0 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  )<=newSize ){.  
1a5b0 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70        char *pTmp
1a5c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1a5d0 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65  pace;.        me
1a5e0 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a  mset(pTmp, 0, sz
1a5f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Page);.        t
1a600 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
1a610 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72  e-szPage) == cur
1a620 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
1a630 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
1a640 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e  ewSize-szPage) >
1a650 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
1a660 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a670 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1a680 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73  ger->fd, pTmp, s
1a690 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73  zPage, newSize-s
1a6a0 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zPage);.      }.
1a6b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a6c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a6d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1a6e0 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1a6f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a700 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a710 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1a720 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f  sanitized versio
1a730 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d  n of the sector-
1a740 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20  size of OS file 
1a750 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65  pFile. The.** re
1a760 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75  turn value is gu
1a770 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20  aranteed to lie 
1a780 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d  between 32 and M
1a790 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1a7a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1a7b0 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1a7c0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1a7d0 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69   int iRet = sqli
1a7e0 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
1a7f0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52  pFile);.  if( iR
1a800 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65  et<32 ){.    iRe
1a810 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  t = 512;.  }else
1a820 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45   if( iRet>MAX_SE
1a830 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
1a840 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
1a850 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
1a860 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f  .    iRet = MAX_
1a870 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1a880 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a  .  return iRet;.
1a890 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1a8a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
1a8b0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1a8c0 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
1a8d0 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
1a8e0 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
1a8f0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1a900 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
1a910 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
1a920 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1a930 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
1a940 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
1a950 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
1a960 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
1a970 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
1a980 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
1a990 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1a9a0 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
1a9b0 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
1a9c0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
1a9d0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1a9e0 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1a9f0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
1aa00 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
1aa10 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1aa20 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
1aa30 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
1aa40 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1aa50 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
1aa60 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1aa70 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1aa80 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
1aa90 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
1aaa0 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1aab0 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
1aac0 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
1aad0 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
1aae0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1aaf0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1ab00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1ab10 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49  ile has the SQLI
1ab20 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1ab30 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f  FE_OVERWRITE pro
1ab40 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a  perty, then set.
1ab50 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ** the effective
1ab60 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20   sector size to 
1ab70 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  its minimum valu
1ab80 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75  e (512).  The pu
1ab90 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67  rpose of.** pPag
1aba0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  er->sectorSize i
1abb0 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20  s to define the 
1abc0 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f  "blast radius" o
1abd0 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20  f bytes that.** 
1abe0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20  might change if 
1abf0 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  a crash occurs w
1ac00 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
1ac10 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1ac20 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20  .** that range. 
1ac30 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53   But with POWERS
1ac40 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74  AFE_OVERWRITE, t
1ac50 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20  he blast radius 
1ac60 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74  is zero.** (that
1ac70 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41   is what POWERSA
1ac80 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61  FE_OVERWRITE mea
1ac90 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d  ns), so we minim
1aca0 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a  ize the sector.*
1acb0 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63  * size.  For bac
1acc0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1acd0 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c  lity of the roll
1ace0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
1acf0 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20  e format,.** we 
1ad00 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68  cannot reduce th
1ad10 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1ad20 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31  or size below 51
1ad30 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1ad40 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
1ad50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ad60 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1ad70 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1ad80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1ad90 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1ada0 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c  r->tempFile.   |
1adb0 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
1adc0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1add0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20  s(pPager->fd) & 
1ade0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1adf0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1ae00 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1ae10 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1ae20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
1ae30 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
1ae40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1ae50 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
1ae60 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
1ae70 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
1ae80 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
1ae90 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
1aea0 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
1aeb0 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20   will segfault. 
1aec0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
1aed0 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
1aee0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1aef0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1af00 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72   = sqlite3Sector
1af10 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
1af20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
1af30 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
1af40 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
1af50 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
1af60 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
1af70 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1af80 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
1af90 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
1afa0 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
1afb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1afc0 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
1afd0 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
1afe0 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
1aff0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
1b000 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
1b010 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1b020 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1b030 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1b040 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
1b050 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
1b060 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1b070 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
1b080 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1b090 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
1b0a0 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
1b0b0 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
1b0c0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1b0d0 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
1b0e0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1b0f0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b100 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
1b110 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
1b120 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
1b130 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
1b140 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
1b150 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1b160 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
1b170 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
1b180 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
1b190 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1b1a0 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
1b1b0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1b1c0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b1d0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
1b1e0 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
1b1f0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
1b200 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
1b210 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
1b220 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1b230 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b240 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
1b250 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
1b260 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
1b270 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
1b280 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
1b290 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
1b2a0 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
1b2b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
1b2c0 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
1b2d0 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
1b2e0 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
1b2f0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1b300 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
1b310 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
1b320 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
1b330 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
1b340 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
1b350 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
1b360 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
1b370 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
1b380 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
1b390 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1b3a0 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
1b3b0 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
1b3c0 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
1b3d0 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
1b3e0 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
1b3f0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
1b400 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
1b410 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
1b420 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
1b430 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1b440 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1b450 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1b460 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b470 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1b480 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1b490 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1b4a0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1b4b0 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1b4c0 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1b4d0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1b4e0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b4f0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1b500 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1b510 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1b520 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1b530 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1b540 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1b550 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1b560 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1b570 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1b580 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1b590 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1b5a0 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1b5b0 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1b5c0 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1b5d0 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1b5e0 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1b5f0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1b600 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1b610 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1b620 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1b630 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1b640 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1b650 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1b660 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1b670 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1b680 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1b690 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1b6a0 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1b6b0 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1b6c0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1b6d0 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1b6e0 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1b6f0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1b700 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1b710 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1b720 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1b730 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1b740 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1b750 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1b760 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1b770 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1b780 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1b790 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1b7a0 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1b7b0 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1b7c0 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1b7d0 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1b7e0 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1b7f0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1b800 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1b810 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1b820 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1b830 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1b840 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1b850 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1b860 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1b870 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1b880 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1b890 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1b8a0 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1b8b0 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1b8c0 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1b8d0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1b8e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1b8f0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1b900 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1b910 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1b920 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1b930 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1b940 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1b950 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1b960 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b970 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1b980 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1b990 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1b9a0 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1b9b0 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1b9c0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1b9d0 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1b9e0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1b9f0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1ba00 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1ba10 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1ba20 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1ba30 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1ba40 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1ba50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ba60 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1ba70 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1ba80 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1ba90 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1baa0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1bab0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1bac0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1bad0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1bae0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1baf0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1bb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bb10 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1bb20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1bb30 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1bb50 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1bb60 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1bb70 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1bb80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1bb90 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1bba0 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1bbb0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1bbc0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1bbd0 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1bbe0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1bbf0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1bc00 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1bc10 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1bc20 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1bc30 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1bc40 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1bc50 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1bc60 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1bc70 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1bc80 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1bc90 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1bca0 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1bcb0 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1bcc0 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61  */.  int nPlayba
1bcd0 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
1bce0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1bcf0 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20   pages restored 
1bd00 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
1bd10 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1bd20 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
1bd30 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
1bd40 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
1bd50 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
1bd60 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
1bd70 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1bd80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1bd90 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  fd) );.  rc = sq
1bda0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1bdb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
1bdc0 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
1bdd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
1bde0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1bdf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
1be00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1be10 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
1be20 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
1be30 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
1be40 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1be50 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1be60 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
1be70 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
1be80 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
1be90 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
1bea0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
1beb0 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
1bec0 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
1bed0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
1bee0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65  **.  ** TODO: Te
1bef0 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f  chnically the fo
1bf00 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72  llowing is an er
1bf10 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61  ror because it a
1bf20 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a  ssumes that.  **
1bf30 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54   buffer Pager.pT
1bf40 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61  mpSpace is (mxPa
1bf50 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20  thname+1) bytes 
1bf60 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20  or larger. i.e. 
1bf70 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65  that.  ** (pPage
1bf80 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70  r->pageSize >= p
1bf90 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1bfa0 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e  athname+1). Usin
1bfb0 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a  g os_unix.c,.  *
1bfc0 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20  * mxPathname is 
1bfd0 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
1bfe0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
1bff0 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
1c000 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
1c010 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
1c020 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1c030 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
1c040 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1c050 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1c060 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1c070 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1c080 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
1c090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c0a0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
1c0b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1c0c0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
1c0d0 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
1c0e0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
1c0f0 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
1c100 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1c110 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
1c120 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
1c130 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1c140 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c150 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
1c160 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
1c170 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
1c180 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
1c190 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
1c1a0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
1c1b0 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
1c1c0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
1c1d0 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
1c1e0 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
1c1f0 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
1c200 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
1c210 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
1c220 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
1c230 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
1c240 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1c250 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
1c260 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
1c270 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
1c280 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1c290 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
1c2a0 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
1c2b0 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
1c2c0 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
1c2d0 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20  ocess must have 
1c2e0 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
1c2f0 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
1c300 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
1c310 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
1c320 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1c330 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
1c340 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
1c350 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
1c360 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
1c370 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
1c380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
1c390 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1c3a0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1c3b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c3c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1c3d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1c3e0 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
1c3f0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1c400 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1c410 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
1c420 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1c430 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
1c440 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
1c450 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
1c460 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
1c470 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1c480 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
1c490 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
1c4a0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1c4b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
1c4c0 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
1c4d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1c4e0 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
1c4f0 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
1c500 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1c510 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
1c520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c530 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1c540 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1c550 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1c560 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1c570 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
1c580 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
1c590 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1c5a0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1c5b0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
1c5c0 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
1c5d0 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
1c5e0 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
1c5f0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
1c600 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
1c610 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
1c620 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
1c630 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
1c640 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
1c650 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
1c660 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1c670 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
1c680 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
1c690 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
1c6a0 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
1c6b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c6c0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
1c6d0 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
1c6e0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c6f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1c700 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
1c710 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
1c720 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
1c730 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
1c740 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
1c750 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
1c760 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
1c770 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c780 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
1c790 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1c7a0 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
1c7b0 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
1c7c0 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
1c7d0 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
1c7e0 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
1c7f0 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
1c800 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
1c810 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
1c820 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
1c830 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1c840 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
1c850 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
1c860 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
1c870 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
1c880 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1c890 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c8a0 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
1c8b0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
1c8c0 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
1c8d0 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
1c8e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1c8f0 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
1c900 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c910 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1c920 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c930 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1c940 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
1c950 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1c960 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1c970 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
1c980 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1c990 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c9a0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1c9b0 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
1c9c0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1c9d0 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
1c9e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1c9f0 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
1ca00 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
1ca10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1ca20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ca30 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1ca40 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
1ca50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
1ca60 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
1ca70 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
1ca80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ca90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1caa0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1cab0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1cac0 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
1cad0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1cae0 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
1caf0 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
1cb00 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
1cb10 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
1cb20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1cb30 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
1cb40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1cb50 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
1cb60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
1cb70 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
1cb80 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1cb90 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1cba0 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
1cbb0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
1cbc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1cbd0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1cbe0 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
1cbf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
1cc00 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
1cc10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cc20 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61  .        nPlayba
1cc30 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ck++;.      }els
1cc40 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e{.        if( r
1cc50 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1cc60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
1cc70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1cc80 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1cc90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1cca0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1ccb0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1ccc0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1ccd0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1cce0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1ccf0 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1cd00 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1cd10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1cd20 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1cd30 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1cd40 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1cd50 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1cd60 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1cd70 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1cd80 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1cd90 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1cda0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1cdb0 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1cdc0 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1cdd0 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1cde0 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1cdf0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1ce00 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1ce10 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1ce20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1ce30 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1ce40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ce50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1ce60 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1ce70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ce80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1ce90 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1cea0 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1ceb0 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1cec0 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1ced0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1cee0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1cef0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1cf00 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1cf10 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1cf20 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1cf30 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1cf40 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1cf50 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1cf60 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1cf70 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1cf80 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1cf90 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1cfa0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1cfb0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1cfc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cfd0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1cfe0 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1cff0 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1d000 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1d010 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1d020 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1d030 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1d040 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1d050 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1d060 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1d070 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1d080 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1d090 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1d0a0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d0b0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1d0c0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1d0d0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1d0e0 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1d0f0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1d100 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1d110 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1d120 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1d130 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1d140 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ods ){.    sqlit
1d150 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1d160 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1d170 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1d180 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d  NCHANGED,0);.  }
1d190 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1d1a0 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
1d1b0 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
1d1c0 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
1d1d0 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
1d1e0 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
1d1f0 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
1d200 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
1d210 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
1d220 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
1d230 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
1d240 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
1d250 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
1d260 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1d270 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
1d280 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
1d290 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
1d2a0 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
1d2b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
1d2c0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
1d2d0 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
1d2e0 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
1d2f0 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
1d300 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
1d310 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1d320 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
1d330 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
1d340 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
1d350 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
1d360 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
1d370 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
1d380 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1d390 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
1d3a0 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
1d3b0 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
1d3c0 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
1d3d0 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
1d3e0 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
1d3f0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1d400 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
1d410 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
1d420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d430 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1d440 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1d450 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
1d460 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1d470 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1d480 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1d490 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
1d4a0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1d4b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1d4c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d4d0 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65  _OK.   && (pPage
1d4e0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1d4f0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1d500 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1d510 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1d520 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1d530 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1d540 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 0);.  }.  if
1d550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d560 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1d570 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1d580 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1d590 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a  r[0]!='\0', 0);.
1d5a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d5b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1d5c0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d5d0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1d5e0 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
1d5f0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1d600 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
1d610 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
1d620 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1d630 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
1d640 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
1d650 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
1d660 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1d670 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
1d680 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
1d690 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
1d6a0 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
1d6b0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d6c0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d6d0 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61  isHot && nPlayba
1d6e0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1d6f0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
1d700 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
1d710 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64  BACK, "recovered
1d720 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25   %d pages from %
1d730 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1d740 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70      nPlayback, p
1d750 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
1d760 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1d770 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1d780 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1d790 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1d7a0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1d7b0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1d7c0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1d7d0 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1d7e0 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1d7f0 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1d800 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1d810 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1d820 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1d830 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1d840 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1d850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1d860 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1d870 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1d880 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1d890 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1d8a0 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1d8b0 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1d8c0 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1d8d0 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1d8e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1d8f0 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1d900 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d910 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1d920 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1d930 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1d940 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1d950 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1d960 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1d970 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1d980 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1d990 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1d9a0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1d9b0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1d9c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1d9d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1d9e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1d9f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1da00 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1da10 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72  dr *pPg, u32 iFr
1da20 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ame){.  Pager *p
1da30 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1da40 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1da50 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1da60 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1da70 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1da80 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
1da90 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1daa0 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1dab0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1dac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1dad0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1dae0 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e   pgsz = pPager->
1daf0 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d  pageSize; /* Num
1db00 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1db10 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
1db20 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1db30 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
1db40 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  && !MEMDB );.  a
1db50 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1db60 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69  ager->fd) );..#i
1db70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1db80 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61  T_WAL.  if( iFra
1db90 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  me ){.    /* Try
1dba0 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67   to pull the pag
1dbb0 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65  e from the write
1dbc0 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20  -ahead log. */. 
1dbd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1dbe0 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67  alReadFrame(pPag
1dbf0 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65  er->pWal, iFrame
1dc00 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61  , pgsz, pPg->pDa
1dc10 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ta);.  }else.#en
1dc20 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  dif.  {.    i64 
1dc30 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
1dc40 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1dc50 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
1dc60 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1dc70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
1dc80 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
1dc90 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
1dca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1dcb0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1dcc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dcd0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1dce0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1dcf0 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1dd00 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1dd10 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1dd20 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1dd30 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1dd40 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1dd50 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1dd60 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1dd70 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1dd80 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1dd90 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1dda0 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1ddb0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1ddc0 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1ddd0 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1dde0 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1ddf0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1de00 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1de10 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1de20 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1de30 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1de40 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1de50 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1de60 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1de70 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1de80 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1de90 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1dea0 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1deb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1dec0 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1ded0 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1dee0 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1def0 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1df00 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1df10 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1df20 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1df30 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1df40 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1df50 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65    ** white noise
1df60 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1df70 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1df80 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1df90 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1dfa0 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1dfb0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1dfc0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1dfd0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1dfe0 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1dff0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1e000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e010 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1e020 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1e030 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1e040 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1e050 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1e060 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1e070 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e080 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1e090 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1e0a0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  pPg->pData, pgno
1e0b0 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
1e0c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20  _NOMEM_BKPT);.. 
1e0d0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1e0e0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1e0f0 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1e100 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1e110 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1e120 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1e130 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1e140 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1e150 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1e160 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1e180 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1e190 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1e1a0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
1e1b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e1c0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76  .** Update the v
1e1d0 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
1e1e0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66  ge-counter at of
1e1f0 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20  fsets 24 and 92 
1e200 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  in.** the header
1e210 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20   and the sqlite 
1e220 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
1e230 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
1e240 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e  ** This is an un
1e250 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
1e260 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  te.  See also th
1e270 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  e pager_incr_cha
1e280 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20  ngecounter().** 
1e290 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e  routine which on
1e2a0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1e2b0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66  hange-counter if
1e2c0 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61   the update is a
1e2d0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65  ctually.** neede
1e2e0 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64  d, as determined
1e2f0 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e   by the pPager->
1e300 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1e310 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a  state variable..
1e320 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1e330 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1e340 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a  ecounter(PgHdr *
1e350 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e  pPg){.  u32 chan
1e360 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f  ge_counter;..  /
1e370 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1e380 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1e390 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1e3a0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1e3b0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1e3c0 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1e3d0 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50  yte((u8*)pPg->pP
1e3e0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e3f0 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73  )+1;.  put32bits
1e400 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e410 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1e420 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  counter);..  /* 
1e430 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
1e440 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
1e450 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
1e460 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a  ..99 and in.  **
1e470 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
1e480 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
1e490 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
1e4a0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
1e4b0 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69  ber.  ** is vali
1e4c0 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  d. */.  put32bit
1e4d0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1e4e0 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65  Data)+92, change
1e4f0 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74  _counter);.  put
1e500 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1e510 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  Pg->pData)+96, S
1e520 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
1e530 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  MBER);.}..#ifnde
1e540 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1e550 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
1e560 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1e570 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
1e580 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  age that has alr
1e590 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72  eady been .** wr
1e5a0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c  itten into the l
1e5b0 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57  og file when a W
1e5c0 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1e5d0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1e5e0 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20  * Parameter iPg 
1e5f0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
1e600 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e  er of said page.
1e610 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65   The pCtx argume
1e620 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c  nt .** is actual
1e630 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
1e640 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1e650 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ure..**.** If pa
1e660 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e  ge iPg is presen
1e670 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  t in the cache, 
1e680 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  and has no outst
1e690 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1e6a0 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63  s,.** it is disc
1e6b0 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  arded. Otherwise
1e6c0 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  , if there are o
1e6d0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
1e6e0 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65  anding.** refere
1e6f0 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63  nces, the page c
1e700 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64  ontent is reload
1e710 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1e720 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  base. If the.** 
1e730 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61  attempt to reloa
1e740 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1e750 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1e760 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c  equired and fail
1e770 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  s, .** return an
1e780 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e790 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
1e7a0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
1e7b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64  tic int pagerUnd
1e7c0 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  oCallback(void *
1e7d0 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b  pCtx, Pgno iPg){
1e7e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e7f0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1e800 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1e810 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20  *)pCtx;.  PgHdr 
1e820 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
1e830 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1e840 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20  ger) );.  pPg = 
1e850 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1e860 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1e870 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1e880 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1e890 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1e8a0 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1e8b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1e8c0 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1e8d0 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46  se{.      u32 iF
1e8e0 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rame = 0;.      
1e8f0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e900 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
1e910 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  >pWal, pPg->pgno
1e920 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
1e930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e950 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1e960 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
1e970 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e990 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e9a0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1e9b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1e9c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1e9d0 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1e9e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1e9f0 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1ea00 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1ea10 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1ea20 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1ea30 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1ea40 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1ea50 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1ea60 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1ea70 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1ea80 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1ea90 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1eaa0 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1eab0 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1eac0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1ead0 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1eae0 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1eaf0 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1eb00 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1eb10 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1eb20 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1eb30 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1eb40 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1eb50 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1eb60 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1eb70 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1eb80 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1eb90 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1eba0 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1ebb0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1ebc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1ebd0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1ebe0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1ebf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ec00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ec10 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1ec20 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1ec30 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1ec40 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1ec50 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1ec60 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1ec70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1eca0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1ecb0 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ecd0 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1ece0 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1ecf0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1ed00 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1ed10 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1ed20 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1ed30 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1ed40 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1ed50 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1ed60 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1ed70 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1ed80 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1ed90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1eda0 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1edb0 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1edc0 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1edd0 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1ede0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1edf0 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1ee00 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1ee10 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1ee20 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1ee30 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1ee40 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1ee50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1ee60 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1ee70 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1ee80 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1ee90 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1eea0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1eeb0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1eec0 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1eed0 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1eee0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1eef0 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1ef00 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1ef10 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1ef20 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1ef30 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1ef40 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1ef50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1ef60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ef70 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1ef80 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1ef90 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1efa0 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1efb0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1efc0 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1efd0 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1efe0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1eff0 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1f000 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1f010 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1f020 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1f030 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1f040 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1f050 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1f060 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1f070 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1f080 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1f090 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1f0a0 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1f0b0 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1f0c0 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1f0d0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1f0e0 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1f0f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1f100 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1f110 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1f120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1f130 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1f140 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1f170 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1f180 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1a0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1f1b0 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1f1c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1f1d0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1f1e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f1f0 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1f200 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1f210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f230 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1f240 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f260 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1f270 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50   in pList */.  P
1f280 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f2a0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1f2b0 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61  er pages */..  a
1f2c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1f2d0 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1f2e0 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1f2f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f300 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1f310 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1f320 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1f330 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1f340 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1f350 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1f360 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1f370 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1f380 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1f390 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1f3a0 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1f3b0 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1f3c0 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1f3d0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1f3e0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1f3f0 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1f400 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1f410 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1f420 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1f430 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1f440 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1f450 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1f460 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1f470 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1f480 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1f490 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1f4a0 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1f4b0 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1f4c0 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1f4d0 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65      PgHdr **ppNe
1f4e0 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20  xt = &pList;.   
1f4f0 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
1f500 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70  for(p=pList; (*p
1f510 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70  pNext = p)!=0; p
1f520 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1f530 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d     if( p->pgno<=
1f540 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  nTruncate ){.   
1f550 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70       ppNext = &p
1f560 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
1f570 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20    nList++;.     
1f580 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1f590 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20  ert( pList );.  
1f5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74  }else{.    nList
1f5b0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 1;.  }.  pPag
1f5c0 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
1f5d0 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e  STAT_WRITE] += n
1f5e0 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69  List;..  if( pLi
1f5f0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
1f600 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1f610 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
1f620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f630 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e  lFrames(pPager->
1f640 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61  pWal, .      pPa
1f650 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1f660 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c  List, nTruncate,
1f670 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65   isCommit, pPage
1f680 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  r->walSyncFlags.
1f690 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
1f6a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1f6b0 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
1f6c0 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1f6d0 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1f6e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1f6f0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1f700 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70  r->pBackup, p->p
1f710 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44  gno, (u8 *)p->pD
1f720 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1f730 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1f740 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69  HECK_PAGES.  pLi
1f750 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1f760 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1f770 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1f780 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f790 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f7a0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
1f7b0 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e  hash(p);.  }.#en
1f7c0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1f7d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
1f7e0 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
1f7f0 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a  ion on the WAL..
1f800 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f810 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61  ne used to be ca
1f820 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53  lled "pagerOpenS
1f830 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75  napshot()" becau
1f840 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c  se it essentiall
1f850 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61  y.** makes a sna
1f860 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74  pshot of the dat
1f870 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72  abase at the cur
1f880 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69  rent point in ti
1f890 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73  me and preserves
1f8a0 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f  .** that snapsho
1f8b0 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1f8c0 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65   reader in spite
1f8d0 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79   of concurrently
1f8e0 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f   changes by.** o
1f8f0 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20  ther writers or 
1f900 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a  checkpointers..*
1f910 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f920 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
1f930 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
1f940 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f970 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1f980 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f9a0 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
1f9b0 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
1f9c0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1f9d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1f9e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f9f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1fa00 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
1fa10 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
1fa20 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73  EADER );..  /* s
1fa30 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1fa40 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
1fa50 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
1fa60 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
1fa70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1fa80 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
1fa90 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
1faa0 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
1fab0 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
1fac0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
1fad0 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
1fae0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
1faf0 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
1fb00 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
1fb10 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
1fb20 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
1fb30 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1fb40 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1fb50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1fb60 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
1fb70 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1fb80 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
1fb90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fba0 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b  OK || changed ){
1fbb0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
1fbc0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1fbd0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
1fbe0 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
1fbf0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
1fc00 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
1fc10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1fc20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1fc30 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1fc40 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1fc50 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
1fc60 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
1fc70 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
1fc80 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
1fc90 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
1fca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fcb0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
1fcc0 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
1fcd0 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
1fce0 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
1fcf0 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
1fd00 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1fd10 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
1fd20 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1fd30 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1fd40 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
1fd50 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
1fd60 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
1fd70 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
1fd80 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
1fd90 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1fda0 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
1fdb0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
1fdc0 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
1fdd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1fde0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1fdf0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
1fe00 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
1fe10 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1fe20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1fe30 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1fe40 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1fe50 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
1fe60 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
1fe70 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1fe80 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
1fe90 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
1fea0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
1feb0 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
1fec0 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
1fed0 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
1fee0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1fef0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
1ff00 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
1ff10 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1ff20 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
1ff30 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1ff40 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
1ff50 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
1ff60 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
1ff70 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
1ff80 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
1ff90 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
1ffa0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1ffb0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1ffc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1ffd0 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1ffe0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67  D_LOCK );.  nPag
1fff0 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
20000 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
20010 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
20020 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
20030 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
20040 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
20050 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  e from the.  ** 
20060 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20  WAL sub-system, 
20070 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61  determine the pa
20080 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65 64 20  ge counte based 
20090 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20  on the size of. 
200a0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
200b0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73   file.  If the s
200c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
200d0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
200e0 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  an.  ** integer 
200f0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
20100 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64  page-size, round
20110 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   up the result..
20120 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20130 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
20140 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20150 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20160 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
20170 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
20180 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20190 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
201a0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
201b0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
201c0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
201d0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
201e0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
201f0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
20200 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20220 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20230 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
20240 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
20250 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20260 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
20270 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
20280 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
20290 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
202a0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
202b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
202c0 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
202d0 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
202e0 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
202f0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
20300 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
20310 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
20320 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
20330 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
20340 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
20350 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
20360 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
20370 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
20380 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
20390 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
203a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
203b0 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
203c0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
203d0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
203e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
203f0 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
20400 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
20410 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
20420 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
20430 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
20440 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
20450 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
20460 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
20470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20480 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
20490 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
204a0 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
204b0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
204c0 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
204d0 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
204e0 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
204f0 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
20500 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
20510 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
20520 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
20530 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
20540 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
20550 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
20560 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
20570 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
20580 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20590 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
205a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
205b0 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
205c0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
205d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
205e0 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
205f0 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
20600 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
20610 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
20620 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
20630 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
20640 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
20650 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
20660 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
20670 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
20680 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
20690 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
206a0 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
206b0 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
206c0 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
206d0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
206e0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
206f0 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
20700 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
20710 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
20720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20730 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20740 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
20750 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
20760 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
20770 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
20780 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
20790 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
207a0 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
207b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
207c0 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
207d0 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
207e0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
207f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20800 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20810 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
20820 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
20830 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
20840 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20850 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20860 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
20870 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20880 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
20890 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
208a0 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
208b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
208c0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
208d0 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
208e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
208f0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
20900 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
20910 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
20920 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
20930 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
20940 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
20950 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
20960 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
20970 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20990 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
209a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
209b0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
209c0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
209d0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
209e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
209f0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
20a00 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
20a10 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
20a20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
20a30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20a40 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
20a50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20a60 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
20a70 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
20a80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20a90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20aa0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
20ab0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
20ac0 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
20ad0 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
20ae0 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
20af0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
20b00 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
20b10 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
20b20 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
20b30 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
20b40 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
20b50 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
20b60 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
20b70 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
20b80 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
20b90 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
20ba0 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
20bb0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
20bc0 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
20bd0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
20be0 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
20bf0 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
20c00 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
20c10 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
20c20 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
20c30 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
20c40 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
20c50 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
20c60 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
20c70 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20c80 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20c90 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
20ca0 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
20cb0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20cc0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
20cd0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
20ce0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
20cf0 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
20d00 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20d10 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
20d20 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20d30 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
20d40 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
20d50 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20d60 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
20d70 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
20d80 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
20d90 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
20da0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
20db0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
20dc0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
20dd0 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
20de0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20df0 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
20e00 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20e10 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
20e20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
20e30 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
20e40 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20e50 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
20e60 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20e70 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20e80 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20e90 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20ea0 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
20eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20ec0 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
20ed0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
20ee0 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
20ef0 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
20f00 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
20f10 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
20f20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
20f30 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
20f40 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
20f50 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
20f60 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20f70 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20f80 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20f90 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20fa0 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
20fb0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
20fc0 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
20fd0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
20fe0 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
20ff0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
21000 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
21010 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
21020 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
21030 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
21040 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
21050 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
21060 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
21070 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
21080 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
21090 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
210a0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
210b0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
210c0 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
210d0 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
210e0 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
210f0 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
21100 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
21110 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
21120 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
21130 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
21140 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
21150 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
21160 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
21170 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
21180 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
21190 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
211a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
211b0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
211c0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
211d0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
211e0 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
211f0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
21200 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
21210 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
21220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
21230 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
21240 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
21250 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
21260 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21270 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
21280 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
21290 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
212a0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
212b0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
212c0 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
212d0 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
212e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
212f0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
21300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21310 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
21320 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
21330 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
21340 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
21350 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
21360 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
21370 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
21380 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
21390 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
213a0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
213b0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
213c0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
213d0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
213e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
213f0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
21400 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
21410 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
21420 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
21430 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
21440 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
21450 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
21460 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
21470 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
21480 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
21490 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
214a0 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
214b0 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
214c0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
214d0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
214e0 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
214f0 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
21500 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21510 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
21520 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
21530 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
21540 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
21550 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
21560 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
21570 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
21580 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
21590 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
215a0 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
215b0 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
215c0 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
215d0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
215e0 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
215f0 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
21600 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
21610 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
21620 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
21630 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
21640 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
21650 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
21660 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
21670 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
21680 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
21690 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
216a0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
216b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
216c0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
216d0 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
216e0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
216f0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21700 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
21710 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
21720 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
21730 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
21740 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
21750 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
21760 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
21770 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
21780 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
21790 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
217a0 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
217b0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
217c0 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
217d0 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
217e0 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
217f0 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
21800 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
21810 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
21820 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21830 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
21840 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
21850 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
21860 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
21870 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
21880 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21890 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
218a0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
218b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
218c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
218d0 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
218e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
218f0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21900 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21920 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21930 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21950 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
21960 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21970 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
21980 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
21990 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
219a0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
219b0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
219c0 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
219d0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
219e0 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
219f0 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
21a00 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
21a10 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
21a20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
21a30 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
21a40 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
21a50 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
21a60 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
21a70 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
21a80 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
21a90 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21aa0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
21ab0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
21ac0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
21ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21ae0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21af0 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
21b00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21b10 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
21b20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
21b30 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
21b40 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
21b50 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
21b60 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
21b70 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21b80 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
21b90 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
21ba0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21bb0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21bc0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21bd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
21be0 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
21bf0 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
21c00 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
21c10 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
21c20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
21c30 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
21c40 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
21c50 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
21c60 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
21c70 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
21c80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21c90 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21ca0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21cb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
21cc0 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
21cd0 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
21ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21cf0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
21d00 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
21d10 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
21d20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21d30 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
21d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
21d50 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
21d60 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21d70 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21d80 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
21d90 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
21da0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
21db0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21dc0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21dd0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21de0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
21df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
21e00 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
21e10 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
21e20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
21e30 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
21e40 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
21e50 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
21e60 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
21e70 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21e80 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
21e90 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
21ea0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
21eb0 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
21ec0 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
21ed0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
21ee0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
21ef0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21f00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21f10 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
21f20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
21f30 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
21f40 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
21f50 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
21f60 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
21f70 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
21f80 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
21f90 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
21fa0 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
21fb0 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
21fc0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21fd0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
21fe0 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
21ff0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
22000 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
22010 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22020 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
22030 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
22040 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
22050 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
22060 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
22070 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
22080 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
22090 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
220a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
220b0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
220c0 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
220d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
220e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
220f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22100 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
22110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22120 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
22130 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
22140 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
22150 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
22160 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
22170 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65  pting to recycle
22180 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65   clean and unuse
22190 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  d pages..*/.void
221a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
221b0 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
221c0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
221d0 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
221e0 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
221f0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
22200 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
22210 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22220 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
22230 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
22240 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
22250 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
22260 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c  empting to spill
22270 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61   pages to journa
22280 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
22290 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
222a0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
222b0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
222c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
222d0 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a  cacheSetSpillsiz
222e0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
222f0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
22300 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49  *.** Invoke SQLI
22310 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
22320 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ZE based on the 
22330 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
22340 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74   szMmap..*/.stat
22350 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78  ic void pagerFix
22360 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a  Maplimit(Pager *
22370 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c  pPager){.#if SQL
22380 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
22390 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  E>0.  sqlite3_fi
223a0 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
223b0 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  >fd;.  if( isOpe
223c0 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65  n(fd) && fd->pMe
223d0 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
223e0 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =3 ){.    sqlite
223f0 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20  3_int64 sz;.    
22400 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d  sz = pPager->szM
22410 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  map;.    pPager-
22420 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a  >bUseFetch = (sz
22430 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
22440 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
22450 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
22460 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
22470 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a  SIZE, &sz);.  }.
22480 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
22490 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
224a0 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d  um size of any m
224b0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
224c0 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
224d0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
224e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
224f0 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20  MmapLimit(Pager 
22500 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
22510 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
22520 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70    pPager->szMmap
22530 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67   = szMmap;.  pag
22540 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
22550 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
22560 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  Free as much mem
22570 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
22580 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a  from the pager..
22590 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
225a0 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72  agerShrink(Pager
225b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
225c0 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b  ite3PcacheShrink
225d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
225e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
225f0 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74  st settings of t
22600 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73  he pager to thos
22610 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
22620 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d  he pgFlags param
22630 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
22640 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61  "level" in pgFla
22650 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
22660 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73  RONOUS_MASK sets
22670 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a   the robustness.
22680 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
22690 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
226a0 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f   to OS crashes o
226b0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
226c0 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20   by.** changing 
226d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
226e0 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
226f0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73  ing the journals
22700 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66  ..** There are f
22710 6f 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  our levels:.**.*
22720 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
22730 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
22740 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
22750 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
22760 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
22770 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
22780 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
22790 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
227a0 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
227b0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
227c0 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
227d0 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
227e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
227f0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
22800 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
22810 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
22820 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
22830 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
22840 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
22850 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
22860 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
22870 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
22880 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
22890 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
228a0 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
228b0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
228c0 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
228d0 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
228e0 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
228f0 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
22900 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
22910 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
22920 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
22930 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
22940 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
22950 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
22960 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
22970 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
22980 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
22990 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
229a0 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
229b0 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
229c0 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
229d0 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
229e0 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
229f0 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
22a10 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
22a20 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
22a30 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
22a40 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
22a50 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
22a60 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
22a70 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
22a80 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
22a90 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
22aa0 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
22ab0 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
22ac0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22ad0 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
22ae0 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
22af0 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
22b00 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
22b10 20 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69     EXTRA     Thi
22b20 73 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65  s is like FULL e
22b30 78 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c  xcept that is al
22b40 73 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72  so syncs the dir
22b50 65 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20  ectory.**       
22b60 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74         that cont
22b70 61 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63  ains the rollbac
22b80 6b 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20  k journal after 
22b90 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
22bb0 72 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64  rnal is unlinked
22bc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
22bd0 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
22be0 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
22bf0 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
22c00 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
22c10 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
22c20 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
22c30 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
22c40 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
22c50 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
22c60 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
22c70 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
22c80 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
22c90 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
22ca0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
22cb0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
22cc0 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
22cd0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
22ce0 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
22cf0 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
22d00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
22d10 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
22d20 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
22d30 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
22d40 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
22d50 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
22d60 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
22d70 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
22d80 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
22d90 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
22da0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
22db0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
22dc0 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
22dd0 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
22de0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
22df0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
22e00 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58  n FULL.** and EX
22e10 54 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65  TRA for WAL mode
22e20 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
22e30 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
22e40 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
22e50 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
22e60 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
22e70 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
22e80 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
22e90 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
22ea0 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
22eb0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
22ec0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
22ed0 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
22ee0 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
22ef0 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
22f00 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
22f10 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
22f20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22f30 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
22f40 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
22f50 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
22f60 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
22f70 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
22f80 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
22f90 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
22fa0 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
22fb0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
22fc0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
22fd0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
22fe0 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
22ff0 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
23000 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
23010 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
23020 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
23030 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
23040 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
23050 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
23060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
23070 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
23080 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
23090 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ags(.  Pager *pP
230a0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
230b0 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
230c0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
230d0 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
230e0 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  pgFlags      /* 
230f0 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f  Various flags */
23100 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
23110 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26  evel = pgFlags &
23120 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
23130 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70  US_MASK;.  if( p
23140 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
23150 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
23160 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  oSync = 1;.    p
23170 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
23180 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
23190 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
231a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
231b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
231c0 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43  evel==PAGER_SYNC
231d0 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30  HRONOUS_OFF ?1:0
231e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
231f0 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d  llSync = level>=
23200 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
23210 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20  S_FULL ?1:0;.   
23220 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
23230 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45  nc = level==PAGE
23240 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58  R_SYNCHRONOUS_EX
23250 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  TRA ?1:0;.  }.  
23260 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
23270 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
23280 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ->syncFlags = 0;
23290 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
232a0 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  tSyncFlags = 0;.
232b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
232c0 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c  ags & PAGER_FULL
232d0 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
232e0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
232f0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
23300 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
23310 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
23320 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
23330 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
23340 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50  lags & PAGER_CKP
23350 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  T_FULLFSYNC ){. 
23360 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23370 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23380 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
23390 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
233a0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
233b0 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
233c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
233d0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
233e0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
233f0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
23400 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23410 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
23420 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
23430 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
23440 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
23450 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
23460 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
23470 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
23480 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41   |= WAL_SYNC_TRA
23490 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20  NSACTIONS;.  }. 
234a0 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
234b0 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20  AGER_CACHESPILL 
234c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
234d0 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
234e0 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
234f0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23500 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
23510 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
23520 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
23530 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23540 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23550 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
23560 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
23570 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
23580 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
23590 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
235a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
235b0 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
235c0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
235d0 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
235e0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
235f0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
23600 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
23610 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
23620 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
23630 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
23640 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
23650 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
23660 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
23670 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
23680 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
23690 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
236a0 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
236b0 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
236c0 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
236d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
236e0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
236f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
23700 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
23710 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
23720 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
23730 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
23740 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
23750 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
23760 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
23770 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23780 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
23790 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
237a0 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
237b0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
237c0 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
237d0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
237e0 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
237f0 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
23800 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
23810 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
23820 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
23830 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
23840 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
23850 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
23860 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
23870 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
23880 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
23890 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
238a0 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
238b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
238c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
238d0 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
238e0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
238f0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
23900 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
23910 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
23920 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
23930 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
23940 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
23950 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
23960 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
23970 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
23980 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
23990 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
239a0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
239b0 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
239c0 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
239d0 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
239e0 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
239f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
23a00 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
23a10 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
23a20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23a30 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
23a40 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
23a50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
23a60 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
23a70 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
23a80 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
23a90 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
23aa0 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
23ab0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
23ac0 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
23ad0 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
23ae0 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
23af0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
23b00 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
23b10 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
23b20 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
23b30 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
23b40 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
23b50 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
23b60 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
23b70 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
23b80 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
23b90 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
23ba0 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
23bb0 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
23bc0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
23bd0 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
23be0 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
23c10 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
23c20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
23c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
23c60 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
23c70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
23c80 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
23c90 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
23ca0 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
23cb0 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
23cc0 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
23cd0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
23ce0 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
23cf0 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
23d00 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
23d10 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
23d20 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
23d30 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
23d40 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
23d50 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
23d60 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
23d70 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
23d80 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
23d90 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
23da0 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
23db0 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
23dc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23dd0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
23de0 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
23df0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
23e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
23e10 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
23e20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
23e30 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
23e40 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
23e50 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
23e60 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
23e70 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
23e80 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
23e90 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
23ea0 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
23eb0 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20  Handler */.){.  
23ec0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
23ed0 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
23ee0 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
23ef0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
23f00 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
23f10 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
23f20 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
23f30 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28     void **ap = (
23f40 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d  void **)&pPager-
23f50 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  >xBusyHandler;. 
23f60 20 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74     assert( ((int
23f70 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b  (*)(void *))(ap[
23f80 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c  0]))==xBusyHandl
23f90 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  er );.    assert
23fa0 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61  ( ap[1]==pBusyHa
23fb0 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20  ndlerArg );.    
23fc0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
23fd0 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
23fe0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
23ff0 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28  L_BUSYHANDLER, (
24000 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a  void *)ap);.  }.
24010 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
24020 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
24030 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
24040 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
24050 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
24060 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
24070 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
24080 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
24090 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
240a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
240b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
240c0 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
240d0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
240e0 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
240f0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
24100 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
24110 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
24120 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
24130 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20  xxx sub-code or 
24140 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
24150 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
24160 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
24170 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
24180 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
24190 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
241a0 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
241b0 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
241c0 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
241d0 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
241e0 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
241f0 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
24200 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
24210 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
24220 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24230 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
24240 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
24250 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
24260 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
24270 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
24280 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
24290 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
242a0 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
242b0 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
242c0 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
242d0 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
242e0 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
242f0 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
24300 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
24310 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
24320 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
24330 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
24340 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
24350 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
24360 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
24370 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
24380 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
24390 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
243a0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
243b0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
243c0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
243d0 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
243e0 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
243f0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
24400 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24410 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
24420 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
24430 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
24440 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
24450 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
24460 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
24470 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
24480 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
24490 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
244a0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
244b0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
244c0 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
244d0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
244e0 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
244f0 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
24500 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
24510 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
24520 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
24530 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
24540 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24550 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
24560 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20  er *pPager, u32 
24570 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
24580 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
24590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
245a0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
245b0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20   possible to do 
245c0 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61  a full assert_pa
245d0 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65  ger_state() here
245e0 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  , as this.  ** f
245f0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
24600 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
24610 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62  n PagerOpen(), b
24620 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a  efore the state.
24630 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65    ** of the Page
24640 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65  r object is inte
24650 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e  rnally consisten
24660 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20  t..  **.  ** At 
24670 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66  one point this f
24680 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
24690 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
246a0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20   pager was in . 
246b0 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
246c0 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65  state. But since
246d0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
246e0 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  te guarantees th
246f0 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  at.  ** there is
24700 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
24710 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
24720 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66  eference, this f
24730 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
24740 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74  a no-op for that
24750 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20   case anyhow..  
24760 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69  */..  u32 pageSi
24770 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
24780 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
24790 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
247a0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
247b0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
247c0 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
247d0 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65   if( (pPager->me
247e0 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
247f0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
24800 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
24810 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
24820 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
24830 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20   && pageSize && 
24840 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70  pageSize!=(u32)p
24850 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
24860 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
24870 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  pNew = NULL;    
24880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
24890 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20  temp space */.  
248a0 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b    i64 nByte = 0;
248b0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
248c0 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
248d0 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50  PEN && isOpen(pP
248e0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
248f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24900 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
24910 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  ->fd, &nByte);. 
24920 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
24930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24940 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72      pNew = (char
24950 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
24960 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
24970 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
24980 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
24990 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
249a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
249b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
249c0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
249d0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
249e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
249f0 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
24a00 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
24a10 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
24a20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24a30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24a40 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
24a50 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
24a60 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
24a70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
24a80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
24a90 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79  ze = (Pgno)((nBy
24aa0 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70  te+pageSize-1)/p
24ab0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
24ac0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24ad0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
24ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
24af0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e  lite3PageFree(pN
24b00 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ew);.    }.  }..
24b10 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
24b20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
24b30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
24b50 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
24b60 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
24b70 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
24b80 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
24b90 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
24ba0 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
24bb0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
24bc0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
24bd0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
24be0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
24bf0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
24c00 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
24c10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24c20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24c30 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
24c40 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
24c50 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
24c60 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
24c70 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
24c80 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
24c90 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
24ca0 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
24cb0 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
24cc0 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
24cd0 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
24ce0 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
24cf0 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
24d00 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
24d10 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
24d20 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
24d30 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
24d40 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
24d50 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
24d60 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
24d70 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
24d80 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
24d90 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
24da0 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
24db0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
24dc0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24dd0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
24de0 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
24df0 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
24e00 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
24e10 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
24e20 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
24e30 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
24e40 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
24e50 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
24e60 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
24e70 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
24e80 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
24e90 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
24ea0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
24eb0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
24ec0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
24ed0 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
24ee0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
24ef0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
24f00 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
24f10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
24f20 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
24f30 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
24f40 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
24f50 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
24f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24f70 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
24f80 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
24f90 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
24fa0 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
24fb0 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
24fc0 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
24fd0 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
24fe0 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
24ff0 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
25000 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
25010 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
25020 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
25030 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
25040 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
25050 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
25060 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
25070 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
25080 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
25090 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
250a0 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
250b0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
250c0 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
250d0 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
250e0 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
250f0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
25100 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
25110 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
25120 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
25130 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
25140 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
25150 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
25160 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
25170 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
25180 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
25190 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
251a0 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
251b0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
251c0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
251d0 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
251e0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
251f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
25200 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
25210 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
25220 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25230 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
25240 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25250 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
25260 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
25270 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
25280 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
25290 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
252a0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
252b0 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
252c0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
252d0 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
252e0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
252f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
25300 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
25310 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
25320 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
25330 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
25340 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
25350 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
25360 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
25370 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
25380 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
25390 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
253a0 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
253b0 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
253c0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
253d0 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
253e0 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
253f0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
25400 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
25410 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
25420 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
25430 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
25440 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
25450 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
25460 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
25470 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
25480 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
25490 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
254a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
254b0 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
254c0 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
254d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
254e0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
254f0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
25500 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
25510 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
25520 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
25530 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
25540 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
25550 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
25560 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
25570 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
25580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
25590 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
255a0 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
255b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
255c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
255d0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
255e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
255f0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
25600 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
25610 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
25620 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
25630 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
25640 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
25650 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
25660 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
25670 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
25680 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
25690 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
256a0 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
256b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
256c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
256d0 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
256e0 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
256f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
25700 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
25710 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
25720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25730 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
25740 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
25760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
25780 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
25790 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
257a0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
257b0 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
257c0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
257d0 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
257e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
257f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25800 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
25810 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
25820 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
25830 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
25840 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
25850 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
25860 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
25870 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
25880 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
25890 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
258a0 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
258b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
258c0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
258d0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
258e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
258f0 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
25900 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
25910 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
25920 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
25930 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
25940 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
25950 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
25960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25970 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
25980 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
25990 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
259a0 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
259b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
259c0 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
259d0 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
259e0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
259f0 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
25a00 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
25a10 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
25a20 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
25a30 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
25a40 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
25a50 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
25a60 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
25a70 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
25a80 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
25a90 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
25aa0 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
25ab0 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
25ac0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
25ad0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
25ae0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
25af0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
25b00 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
25b10 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
25b20 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
25b30 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
25b40 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
25b50 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
25b60 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
25b70 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
25b80 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
25b90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
25ba0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
25bb0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25bc0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
25bd0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bf0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
25c00 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
25c10 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
25c20 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
25c30 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
25c40 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
25c50 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20   already held), 
25c60 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72  or one of the tr
25c70 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74  ansitions that t
25c80 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
25c90 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
25ca0 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
25cb0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
25cc0 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
25cd0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
25ce0 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
25cf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
25d00 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
25d10 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
25d20 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
25d30 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
25d40 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
25d50 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
25d60 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
25d70 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
25d80 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
25d90 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
25da0 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
25db0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
25dc0 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
25dd0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
25de0 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
25df0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
25e00 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
25e10 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
25e20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25e30 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
25e40 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25e50 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
25e60 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
25e70 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
25e80 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
25e90 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
25ea0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
25eb0 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
25ec0 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
25ed0 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
25ee0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
25ef0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
25f00 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
25f10 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
25f20 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
25f30 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
25f40 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
25f50 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
25f60 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
25f70 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
25f80 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
25f90 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
25fa0 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
25fb0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
25fc0 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
25fd0 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
25fe0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
25ff0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
26000 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
26010 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
26020 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
26030 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
26040 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
26050 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
26060 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
26070 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
26080 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
26090 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
260a0 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
260b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
260c0 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
260d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
260e0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
260f0 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
26100 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
26110 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
26120 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
26130 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65  ehavior would be
26140 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
26150 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
26160 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
26170 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
26180 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
26190 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
261a0 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
261b0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
261c0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
261d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
261e0 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
261f0 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
26200 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
26210 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
26220 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
26230 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
26240 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
26250 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
26260 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
26270 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
26280 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
26290 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
262a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
262b0 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
262c0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
262d0 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
262e0 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
262f0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
26300 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
26310 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
26320 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
26330 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
26340 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
26350 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
26360 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26370 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
26380 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
26390 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
263a0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
263b0 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
263c0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
263d0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
263e0 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
263f0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
26400 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
26410 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
26420 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
26430 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
26440 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
26450 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
26460 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
26470 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
26480 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
26490 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
264a0 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
264b0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
264c0 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
264d0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
264e0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
264f0 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
26500 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
26510 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
26520 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26530 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
26540 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
26550 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
26560 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20  action..** Once 
26570 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
26580 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  s been called, t
26590 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
265a0 75 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a  ust either be.**
265b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20   rolled back or 
265c0 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73  committed. It is
265d0 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c   not safe to cal
265e0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
265f0 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74  and.** then cont
26600 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20  inue writing to 
26610 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
26620 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
26630 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
26640 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
26650 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
26660 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
26670 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
26680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26690 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
266a0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
266b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
266c0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f  ze = nPage;..  /
266d0 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
266e0 68 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c  he code here cal
266f0 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  led assertTrunca
26700 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74  teConstraint() t
26710 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68  o.  ** ensure th
26720 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69  at all pages bei
26730 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61  ng truncated awa
26740 79 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  y by this operat
26750 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66  ion are,.  ** if
26760 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
26770 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e  epoints are open
26780 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  , present in the
26790 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
267a0 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74   journal so that
267b0 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73   they can be res
267c0 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76  tored if the sav
267d0 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64  epoint is rolled
267e0 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73  .  ** back. This
267f0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
26800 63 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20  cessary as this 
26810 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
26820 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64  only.  ** called
26830 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
26840 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
26850 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f  action. So altho
26860 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ugh the .  ** Pa
26870 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73  ger object may s
26880 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73  till have open s
26890 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72  avepoints (Pager
268a0 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c  .nSavepoint!=0),
268b0 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e   .  ** they cann
268c0 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
268d0 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74  k. So the assert
268e0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
268f0 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69  nt() call.  ** i
26900 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72  s no longer corr
26910 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a  ect. */.}.../*.*
26920 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26930 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
26940 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f   attempting a ho
26950 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
26960 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20  ck. It.** syncs 
26970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26980 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73   to disk, then s
26990 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ets pPager->jour
269a0 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a  nalHdr to the.**
269b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
269c0 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61  rnal file so tha
269d0 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  t the pager_play
269e0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b  back() routine k
269f0 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  nows.** that the
26a00 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
26a10 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
26a20 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63  nced..**.** Sync
26a30 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
26a40 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  l to disk before
26a50 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
26a60 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75  oll it back ensu
26a70 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20  res .** that if 
26a80 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  a power-failure 
26a90 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
26aa0 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  e rollback, the 
26ab0 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20  process that.** 
26ac0 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63  attempts rollbac
26ad0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74  k following syst
26ae0 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73  em recovery sees
26af0 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61   the same journa
26b00 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20  l.** content as 
26b10 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
26b20 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
26b30 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65  g goes as planne
26b40 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
26b50 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
26b60 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  ise, .** an SQLi
26b70 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
26b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
26b90 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
26ba0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26bb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26bc0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
26bd0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
26be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26bf0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
26c00 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
26c10 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69  NORMAL);.  }.  i
26c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26c30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
26c40 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
26c50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
26c60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
26c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26c80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  c;.}../*.** Obta
26c90 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
26ca0 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  o a memory mappe
26cb0 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f  d page object fo
26cc0 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  r page number pg
26cd0 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20  no. .** The new 
26ce0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20  object will use 
26cf0 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74  the pointer pDat
26d00 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  a, obtained from
26d10 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66   xFetch()..** If
26d20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
26d30 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e   *ppPage to poin
26d40 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
26d50 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61  e reference.** a
26d60 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
26d70 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
26d80 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
26d90 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
26da0 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74  set.** *ppPage t
26db0 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61  o zero..**.** Pa
26dc0 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62  ge references ob
26dd0 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
26de0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
26df0 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73  should be releas
26e00 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ed.** by calling
26e10 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
26e20 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
26e30 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
26e40 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67  reMapPage(.  Pag
26e50 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e70 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
26e80 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
26eb0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
26ec0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
26ed0 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28        /* xFetch(
26ee0 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69  )'d data for thi
26ef0 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
26f00 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20  r **ppPage      
26f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26f20 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67  UT: Acquired pag
26f30 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
26f40 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
26f70 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e  d page to return
26f80 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61   */.  .  if( pPa
26f90 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26fa0 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
26fb0 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
26fc0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
26fd0 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
26fe0 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
26ff0 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
27000 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  rty = 0;.    mem
27010 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30  set(p->pExtra, 0
27020 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
27030 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27040 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50  *ppPage = p = (P
27050 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  gHdr *)sqlite3Ma
27060 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
27070 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d  PgHdr) + pPager-
27080 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66  >nExtra);.    if
27090 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p==0 ){.      
270a0 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
270b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
270c0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
270d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
270e0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  Data);.      ret
270f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27100 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
27110 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f   p->pExtra = (vo
27120 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  id *)&p[1];.    
27130 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52  p->flags = PGHDR
27140 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52  _MMAP;.    p->nR
27150 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70  ef = 1;.    p->p
27160 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
27170 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
27180 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20  ->pExtra==(void 
27190 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73  *)&p[1] );.  ass
271a0 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30  ert( p->pPage==0
271b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
271c0 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d  >flags==PGHDR_MM
271d0 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AP );.  assert( 
271e0 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  p->pPager==pPage
271f0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
27200 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20  ->nRef==1 );..  
27210 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  p->pgno = pgno;.
27220 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61    p->pData = pDa
27230 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ta;.  pPager->nM
27240 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74  mapOut++;..  ret
27250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27260 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
27270 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
27280 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73  age pPg. pPg mus
27290 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75  t have been retu
272a0 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65  rned by an .** e
272b0 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70  arlier call to p
272c0 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
272d0 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
272e0 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73  void pagerReleas
272f0 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a  eMapPage(PgHdr *
27300 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
27310 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
27320 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ger;.  pPager->n
27330 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67  MmapOut--;.  pPg
27340 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
27350 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27360 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  ;.  pPager->pMma
27370 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b  pFreelist = pPg;
27380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
27390 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
273a0 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b  ->iVersion>=3 );
273b0 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65  .  sqlite3OsUnfe
273c0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
273d0 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
273e0 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
273f0 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  ize, pPg->pData)
27400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
27410 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74  all PgHdr object
27420 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
27430 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c  Pager.pMmapFreel
27440 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ist list..*/.sta
27450 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
27460 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20  eeMapHdrs(Pager 
27470 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
27480 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70  r *p;.  PgHdr *p
27490 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50  Next;.  for(p=pP
274a0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
274b0 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  ist; p; p=pNext)
274c0 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
274d0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c  >pDirty;.    sql
274e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
274f0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  }.}.../*.** Shut
27500 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
27510 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
27520 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
27530 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
27540 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
27550 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
27560 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
27570 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
27580 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
27590 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
275a0 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
275b0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
275c0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
275d0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
275e0 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
275f0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
27600 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
27610 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
27620 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
27630 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
27640 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
27650 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
27660 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
27670 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
27680 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
27690 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
276a0 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
276b0 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
276c0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
276d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
276e0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
276f0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
27700 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
27710 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
27720 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
27730 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
27740 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
27750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
27760 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
27770 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70  pPager){.  u8 *p
27780 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
27790 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
277a0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
277b0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
277c0 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c  ger) );.  disabl
277d0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
277e0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
277f0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
27800 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72  loc();.  pagerFr
27810 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72  eeMapHdrs(pPager
27820 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
27830 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
27840 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
27850 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
27860 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27870 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61  _WAL.  sqlite3Wa
27880 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
27890 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70  Wal, pPager->ckp
278a0 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67  tSyncFlags, pPag
278b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54  er->pageSize, pT
278c0 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  mp);.  pPager->p
278d0 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Wal = 0;.#endif.
278e0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
278f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
27900 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
27910 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
27920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
27930 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
27940 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
27950 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
27960 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
27970 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
27980 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
27990 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
279a0 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
279b0 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
279c0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
279d0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
279e0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
279f0 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
27a00 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
27a10 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
27a20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
27a30 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
27a40 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
27a50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
27a60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
27a70 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
27a80 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
27a90 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
27aa0 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
27ab0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
27ac0 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
27ad0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
27ae0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
27af0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
27b00 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
27b10 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
27b20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
27b30 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
27b40 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
27b50 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
27b60 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
27b70 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
27b80 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
27b90 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
27ba0 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
27bb0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
27bc0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
27bd0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
27be0 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
27bf0 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
27c00 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
27c10 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
27c20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
27c30 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
27c40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
27c50 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
27c60 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
27c70 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
27c80 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
27c90 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
27ca0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
27cb0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
27cc0 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
27cd0 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
27ce0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
27cf0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
27d00 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
27d10 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
27d20 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
27d30 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
27d40 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
27d50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
27d60 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
27d70 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
27d80 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
27d90 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
27da0 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
27db0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27dc0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
27dd0 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
27de0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
27df0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27e00 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
27e10 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
27e20 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
27e30 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
27e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27e50 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
27e60 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
27e70 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
27e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
27e90 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
27ea0 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
27eb0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
27ec0 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
27ed0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
27ee0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
27ef0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
27f00 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
27f10 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
27f20 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
27f30 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
27f40 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
27f50 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
27f60 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
27f70 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
27f80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
27f90 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
27fa0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
27fb0 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
27fc0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
27fd0 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
27fe0 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
27ff0 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
28000 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
28010 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
28020 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
28030 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
28040 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
28050 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
28060 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
28070 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
28080 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
28090 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
280a0 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
280b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
280c0 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
280d0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
280e0 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c  stics of the fil
280f0 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c  e-system, as fol
28100 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
28110 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
28120 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ile is an in-mem
28130 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
28140 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64  , no action need
28150 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e  .**     be taken
28160 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65  ..**.**   * Othe
28170 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65  rwise, if the de
28180 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
28190 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41  pport the SAFE_A
281a0 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a  PPEND property,.
281b0 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20  **     then the 
281c0 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
281d0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
281e0 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
281f0 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73  header.**     is
28200 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74   updated to cont
28210 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
28220 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  f journal record
28230 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
28240 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20     been written 
28250 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66  following it. If
28260 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70   the pager is op
28270 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d  erating in full-
28280 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65  sync.**     mode
28290 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
282a0 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
282b0 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  d before this fi
282c0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a  eld is updated..
282d0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
282e0 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
282f0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51   support the SEQ
28300 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79  UENTIAL property
28310 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a  , then .**     j
28320 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
28330 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ynced..**.** Or,
28340 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a   in pseudo-code:
28350 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54  .**.**   if( NOT
28360 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72   <in-memory jour
28370 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69  nal> ){.**     i
28380 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45  f( NOT SAFE_APPE
28390 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ND ){.**       i
283a0 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f  f( <full-sync mo
283b0 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  de> ) xSync(<jou
283c0 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
283d0 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52        <update nR
283e0 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20  ec field>.**    
283f0 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   } .**     if( N
28400 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20  OT SEQUENTIAL ) 
28410 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
28420 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  ile>);.**   }.**
28430 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
28440 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
28450 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
28460 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
28470 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
28480 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
28490 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
284a0 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
284b0 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
284c0 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
284d0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
284e0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
284f0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
28500 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
28510 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
28520 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
28530 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b  er, int newHdr){
28540 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
28570 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
28580 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
28590 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
285a0 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
285b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
285c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
285d0 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
285e0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
285f0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
28600 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
28610 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
28620 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
28630 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
28640 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
28650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28660 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
28670 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
28680 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
28690 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
286a0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
286b0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
286c0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
286d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
286e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
286f0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63  EMORY ){.      c
28700 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
28710 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
28720 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
28730 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
28740 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
28750 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
28760 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
28770 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28780 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
28790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
287a0 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
287b0 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62   an obscure prob
287c0 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74  lem. If the last
287d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
287e0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74      ** that wrot
287f0 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  e to this databa
28800 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67  se was operating
28810 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a   in persistent-j
28820 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
28830 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  * mode, then the
28840 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
28850 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
28860 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67  actually be larg
28870 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
28880 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  an Pager.journal
28890 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68  Off bytes. If th
288a0 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20  e next thing in 
288b0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
288c0 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70      ** file happ
288d0 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72  ens to be a jour
288e0 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74  nal-header (writ
288f0 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74  ten as part of t
28900 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
28910 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f  evious connectio
28920 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  n's transaction)
28930 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72  , and a crash or
28940 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a   power-failure .
28950 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72          ** occur
28960 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20  s after nRec is 
28970 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f  updated but befo
28980 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  re this connecti
28990 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20  on writes .     
289a0 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65     ** anything e
289b0 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  lse to the journ
289c0 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d  al file (or comm
289d0 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69  its/rolls back i
289e0 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts .        ** t
289f0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65  ransaction), the
28a00 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63  n SQLite may bec
28a10 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65  ome confused whe
28a20 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20  n doing the .   
28a30 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
28a40 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  nal rollback fol
28a50 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e  lowing recovery.
28a60 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63   It may roll bac
28a70 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  k all.        **
28a80 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
28a90 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20  ions data, then 
28aa0 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69  proceed to rolli
28ab0 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c  ng back the old,
28ac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d  .        ** out-
28ad0 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61  of-date data tha
28ae0 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61  t follows it. Da
28af0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
28b00 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
28b10 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b        ** To work
28b20 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
28b30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28b40 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f  e does appear to
28b50 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20   contain.       
28b60 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64   ** a valid head
28b70 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67  er following Pag
28b80 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74  er.journalOff, t
28b90 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30  hen write a 0x00
28ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
28bb0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
28bc0 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69   it to prevent i
28bd0 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63  t from being rec
28be0 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20  ognized..       
28bf0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56   **.        ** V
28c00 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72  ariable iNextHdr
28c10 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
28c20 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77   the offset at w
28c30 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20  hich this.      
28c40 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63    ** problematic
28c50 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63   header will occ
28c60 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ur, if it exists
28c70 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64  . aMagic is used
28c80 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20   .        ** as 
28c90 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
28ca0 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68  er to inspect th
28cb0 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
28cc0 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20  f bytes of.     
28cd0 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74     ** the potent
28ce0 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ial journal head
28cf0 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
28d00 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74         i64 iNext
28d10 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
28d20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
28d30 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61  .        u8 zHea
28d40 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28d50 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20  nalMagic)+4];.. 
28d60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48         memcpy(zH
28d70 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
28d80 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
28d90 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
28da0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
28db0 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
28dc0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
28dd0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
28de0 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64  .        iNextHd
28df0 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61  rOffset = journa
28e00 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
28e10 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
28e20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
28e30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
28e40 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
28e50 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
28e60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28e70 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
28e80 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
28e90 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
28ea0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
28eb0 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
28ec0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
28ed0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28ee0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
28ef0 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
28f00 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28f20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28f30 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
28f40 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
28f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
28f60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28f70 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
28f80 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
28f90 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
28fa0 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
28fb0 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
28fc0 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
28fd0 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
28fe0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
28ff0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
29000 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
29010 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
29020 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
29030 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
29040 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
29050 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
29060 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
29070 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
29080 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29090 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
290a0 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
290b0 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
290c0 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
290d0 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
290e0 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
290f0 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
29100 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
29110 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
29120 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
29130 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
29140 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
29150 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
29160 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
29170 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
29180 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
29190 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
291a0 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
291b0 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
291c0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
291d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
291e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
291f0 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
29200 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
29210 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
29220 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
29230 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
29240 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
29250 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
29260 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
29270 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
29280 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
29290 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
292a0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
292b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
292c0 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
292d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
292e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
292f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29300 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
29310 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
29320 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
29330 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
29340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29350 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
29360 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
29370 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
29380 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
29390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
293a0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
293b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
293c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
293d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
293e0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
293f0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
29400 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
29410 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
29420 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
29430 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29440 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
29450 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
29460 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
29470 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29480 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
29490 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
294a0 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  ncFlags| .      
294b0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
294c0 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  cFlags==SQLITE_S
294d0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
294e0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
294f0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
29500 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29510 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
29520 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
29530 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
29540 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
29550 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20  ournalOff;.     
29560 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30   if( newHdr && 0
29570 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29580 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
29590 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
295a0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
295b0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
295c0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
295d0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
295e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
295f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29600 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
29610 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
29620 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
29630 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
29640 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c   }.  }..  /* Unl
29650 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
29660 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c   in noSync mode,
29670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29680 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a  e was just .  **
29690 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
296a0 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  nced. Either way
296b0 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  , clear the PGHD
296c0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
296d0 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61   on .  ** all pa
296e0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ges..  */.  sqli
296f0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
29700 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
29710 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67  pPCache);.  pPag
29720 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
29730 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b  ER_WRITER_DBMOD;
29740 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
29750 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
29760 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
29770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29780 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
29790 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
297a0 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
297b0 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
297c0 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20  connected.** by 
297d0 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
297e0 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66   pointer. This f
297f0 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65  unction writes e
29800 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  ach one of the.*
29810 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  * in-memory page
29820 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f  s in the list to
29830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29840 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
29850 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c   may.** be NULL,
29860 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
29870 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20   empty list. In 
29880 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
29890 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  unction is.** a 
298a0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
298b0 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64   pager must hold
298c0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
298d0 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74  RVED lock when t
298e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
298f0 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72  is called. Befor
29900 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69  e writing anythi
29910 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
29920 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f  se file, this lo
29930 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65  ck.** is upgrade
29940 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
29950 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  E lock. If the l
29960 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
29970 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  tained,.** SQLIT
29980 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
29990 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69  ed and no data i
299a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
299b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
299c0 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
299d0 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ger is a temp-fi
299e0 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  le pager and the
299f0 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73   actual file-sys
29a00 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e  tem file.** is n
29a10 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20  ot yet open, it 
29a20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f  is created and o
29a30 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79  pened before any
29a40 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69   data is .** wri
29a50 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  tten out..**.** 
29a60 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  Once the lock ha
29a70 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20  s been upgraded 
29a80 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
29a90 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  y, the file open
29aa0 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ed,.** the pages
29ab0 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74   are written out
29ac0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29ad0 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72   file in list or
29ae0 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20  der. Writing.** 
29af0 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65  a page is skippe
29b00 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69  d if it meets ei
29b10 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ther of the foll
29b20 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a  owing criteria:.
29b30 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
29b40 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  ge number is gre
29b50 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e  ater than Pager.
29b60 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20  dbSize, or.**   
29b70 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  * The PGHDR_DONT
29b80 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73  _WRITE flag is s
29b90 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  et on the page..
29ba0 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67  **.** If writing
29bb0 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73   out a page caus
29bc0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
29bd0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61  file to grow, Pa
29be0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ger.dbFileSize.*
29bf0 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  * is updated acc
29c00 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67  ordingly. If pag
29c10 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f  e 1 is written o
29c20 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ut, then the val
29c30 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20  ue cached.** in 
29c40 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
29c50 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  [] is updated to
29c60 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76   match the new v
29c70 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
29c80 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
29c90 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
29ca0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
29cb0 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
29cc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
29cd0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
29ce0 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  * occurs, an IO 
29cf0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29d00 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
29d10 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
29d20 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f  k cannot.** be o
29d30 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f  btained, SQLITE_
29d40 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
29d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29d60 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
29d70 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67  list(Pager *pPag
29d80 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74  er, PgHdr *pList
29d90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
29da0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
29db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29dc0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
29dd0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
29de0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
29df0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  or rollback page
29e00 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  rs in WRITER_DBM
29e10 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  OD state. */.  a
29e20 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
29e30 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
29e40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29e50 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70 50 61  >tempFile || pPa
29e60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
29e70 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
29e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29e90 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
29ea0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
29eb0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
29ec0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 4c  Pager->fd) || pL
29ed0 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 29  ist->pDirty==0 )
29ee0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
29ef0 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
29f00 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
29f10 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
29f20 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
29f30 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
29f40 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
29f50 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
29f60 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
29f70 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
29f80 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
29f90 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
29fa0 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
29fb0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
29fc0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
29fd0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
29fe0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
29ff0 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
2a000 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
2a010 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
2a020 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
2a030 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
2a040 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  gs);.  }..  /* B
2a050 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
2a060 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20  write, give the 
2a070 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68  VFS a hint of wh
2a080 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a  at the final.  *
2a090 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c  * file size will
2a0a0 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65   be..  */.  asse
2a0b0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2a0c0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2a0d0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28  er->fd) );.  if(
2a0e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc==SQLITE_OK .
2a0f0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
2a100 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d  HintSize<pPager-
2a110 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70  >dbSize.   && (p
2a120 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20  List->pDirty || 
2a130 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67  pList->pgno>pPag
2a140 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a  er->dbHintSize).
2a150 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
2a160 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
2a170 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a180 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
2a190 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
2a1a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
2a1b0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
2a1c0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
2a1d0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
2a1e0 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20  T, &szFile);.   
2a1f0 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
2a200 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2a210 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Size;.  }..  whi
2a220 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2a230 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
2a240 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c    Pgno pgno = pL
2a250 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20  ist->pgno;..    
2a260 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
2a270 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
2a280 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
2a290 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
2a2a0 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
2a2b0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
2a2c0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
2a2d0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
2a2e0 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
2a2f0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
2a300 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
2a310 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
2a320 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
2a330 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
2a340 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
2a350 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
2a360 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
2a370 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74   ** Also, do not
2a380 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70   write out any p
2a390 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65  age that has the
2a3a0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
2a3b0 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65  E flag.    ** se
2a3c0 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65  t (set by sqlite
2a3d0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2a3e0 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ))..    */.    i
2a3f0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
2a400 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
2a410 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
2a420 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
2a430 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2a440 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
2a450 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
2a460 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ze;   /* Offset 
2a470 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
2a480 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
2a4c0 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20  e */    ..      
2a4d0 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e  assert( (pList->
2a4e0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2a4f0 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
2a500 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
2a510 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
2a520 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
2a530 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20  r(pList);..     
2a540 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
2a550 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
2a560 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2a570 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
2a580 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
2a590 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
2a5a0 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
2a5b0 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
2a5c0 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
2a5d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a5e0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2a5f0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
2a600 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
2a610 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
2a620 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
2a630 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
2a640 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
2a650 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
2a660 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
2a670 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
2a680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a690 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
2a6a0 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
2a6b0 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
2a6c0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
2a6d0 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
2a6e0 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
2a6f0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
2a700 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
2a710 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
2a720 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
2a730 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
2a740 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
2a750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a760 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
2a770 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
2a780 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
2a790 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
2a7a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a7b0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
2a7c0 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b  GER_STAT_WRITE]+
2a7d0 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  +;..      /* Upd
2a7e0 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
2a7f0 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
2a800 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2a810 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
2a820 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
2a830 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
2a840 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
2a850 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
2a860 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
2a870 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
2a880 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
2a890 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
2a8a0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
2a8b0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
2a8c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2a8d0 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
2a8e0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
2a8f0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
2a900 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
2a910 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
2a920 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
2a930 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c  _count);.    }el
2a940 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
2a950 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25  RACE(("NOSTORE %
2a960 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2a970 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2a980 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
2a990 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
2a9a0 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ash(pList);.    
2a9b0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
2a9c0 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
2a9d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a9e0 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
2a9f0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
2aa00 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69  le is open. If i
2aa10 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
2aa20 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n, this .** func
2aa30 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2aa40 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa50 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2aa60 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
2aa70 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
2aa80 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
2aa90 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
2aaa0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2aab0 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73  d if a call to s
2aac0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a  qlite3OsOpen() .
2aad0 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  ** fails..*/.sta
2aae0 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
2aaf0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2ab00 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2ab10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2ab20 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2ab30 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
2ab40 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
2ab50 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  =  SQLITE_OPEN_S
2ab60 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c 49  UBJOURNAL | SQLI
2ab70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2ab80 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54  E .      | SQLIT
2ab90 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
2aba0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
2abb0 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20 53  USIVE .      | S
2abc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
2abd0 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69 6e  EONCLOSE;.    in
2abe0 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 73  t nStmtSpill = s
2abf0 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74  qlite3Config.nSt
2ac00 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66 28  mtSpill;.    if(
2ac10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ac20 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2ac30 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
2ac40 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
2ac50 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
2ac60 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31 3b  nStmtSpill = -1;
2ac70 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2ac80 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
2ac90 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
2aca0 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64   0, pPager->sjfd
2acb0 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53 70  , flags, nStmtSp
2acc0 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ill);.  }.  retu
2acd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ace0 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
2acf0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2ad00 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
2ad10 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2ad20 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  nal. .**.** If s
2ad30 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
2ad40 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
2ad50 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e  ding to pPg->pgn
2ad60 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73  o in the bitvecs
2ad70 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e  .** for all open
2ad80 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f   savepoints befo
2ad90 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2ada0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2adb0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2adc0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
2add0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
2ade0 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
2adf0 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65  code if the atte
2ae00 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
2ae10 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2ae20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51  fails, or .** SQ
2ae30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
2ae40 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69  malloc fails whi
2ae50 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74  le setting a bit
2ae60 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a   in a savepoint.
2ae70 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74  ** bitvec..*/.st
2ae80 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
2ae90 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70  nalPage(PgHdr *p
2aea0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
2aeb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
2aec0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2aed0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
2aee0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2aef0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
2af00 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20  ALMODE_OFF ){.. 
2af10 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
2af20 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  ub-journal, if i
2af30 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
2af40 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f  y been opened */
2af50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2af60 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2af70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2af80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2af90 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  d) || pagerUseWa
2afa0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
2afb0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2afc0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c  pPager->sjfd) ||
2afd0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2afe0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2aff0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
2b000 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20  Pager) .        
2b010 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61   || pageInJourna
2b020 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a  l(pPager, pPg) .
2b030 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
2b040 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
2b050 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
2b060 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2b070 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2b080 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b090 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
2b0a0 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
2b0b0 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
2b0c0 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
2b0d0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
2b0e0 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
2b0f0 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
2b100 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
2b120 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
2b130 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
2b140 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
2b150 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
2b160 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
2b170 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ize);.      char
2b180 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20   *pData2;.  .   
2b190 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2b1a0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
2b1b0 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
2b1c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
2b1d0 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2b1e0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
2b1f0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
2b200 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2b210 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2b220 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
2b230 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2b240 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
2b250 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
2b260 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b290 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
2b2a0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
2b2b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2b2c0 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
2b2d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2b2e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b2f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
2b300 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
2b310 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
2b320 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
2b330 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
2b340 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2b350 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2b360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b370 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
2b380 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
2b390 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a 70  equired(PgHdr *p
2b3a0 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52  Pg){.  if( subjR
2b3b0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
2b3c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
2b3d0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2b3e0 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
2b3f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b400 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
2b410 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2b420 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
2b430 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
2b440 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
2b450 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
2b460 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
2b470 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
2b480 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2b490 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
2b4a0 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
2b4b0 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
2b4c0 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
2b4d0 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
2b4e0 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
2b4f0 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
2b500 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
2b510 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
2b520 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
2b530 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
2b540 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
2b550 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
2b560 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
2b570 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
2b580 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
2b590 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
2b5a0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
2b5b0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
2b5c0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
2b5d0 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
2b5e0 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
2b5f0 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
2b600 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
2b610 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2b620 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
2b630 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
2b640 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
2b650 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
2b660 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2b670 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
2b680 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
2b690 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
2b6a0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
2b6b0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2b6c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2b6d0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2b6e0 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
2b6f0 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
2b700 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2b710 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
2b720 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
2b730 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
2b740 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
2b750 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
2b760 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2b770 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2b780 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2b790 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2b7a0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2b7b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b7c0 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
2b7d0 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
2b7e0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2b7f0 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
2b800 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b810 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2b820 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
2b830 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
2b840 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2b850 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
2b860 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2b870 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73   NOSYNC bit is s
2b880 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
2b890 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
2b8a0 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
2b8b0 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
2b8c0 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
2b8d0 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
2b8e0 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
2b8f0 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
2b900 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b910 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
2b920 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
2b930 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
2b940 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
2b950 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
2b960 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
2b970 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e  pill ROLLBACK an
2b980 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62  d OFF bits inhib
2b990 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70  its all cache sp
2b9a0 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61  illing.  ** rega
2b9b0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2b9c0 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20  r or not a sync 
2b9d0 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68  is required.  Th
2b9e0 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  is is set during
2b9f0 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b  .  ** a rollback
2ba00 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71 75   or by user requ
2ba10 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  est, respectivel
2ba20 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69  y..  **.  ** Spi
2ba30 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72  lling is also pr
2ba40 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e  ohibited when in
2ba50 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
2ba60 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64  since that could
2ba70 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61  .  ** lead to da
2ba80 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
2ba90 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72  n.   In the curr
2baa0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
2bab0 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69  on it .  ** is i
2bac0 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71  mpossible for sq
2bad0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
2bae0 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  () to be called 
2baf0 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
2bb00 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e  =3.  ** while in
2bb10 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2bb20 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d  , hence it is im
2bb30 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
2bb40 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a  s routine to.  *
2bb50 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74  * be called in t
2bb60 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2bb70 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77   Nevertheless, w
2bb80 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45  e include a NEVE
2bb90 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f  R().  ** test fo
2bba0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2bbb0 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64  e as a safeguard
2bbc0 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20   against future 
2bbd0 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  changes..  */.  
2bbe0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2bbf0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2bc00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2bc10 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2bc20 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2bc30 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2bc40 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  CK );.  testcase
2bc50 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2bc60 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2bc70 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61  _OFF );.  testca
2bc80 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2bc90 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2bca0 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69  AG_NOSYNC );.  i
2bcb0 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
2bcc0 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50  Spill.   && ((pP
2bcd0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2bce0 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f   & (SPILLFLAG_RO
2bcf0 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47  LLBACK|SPILLFLAG
2bd00 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20  _OFF))!=0.      
2bd10 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  || (pPg->flags &
2bd20 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2bd30 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72  )!=0).  ){.    r
2bd40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bd50 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69  .  }..  pPg->pDi
2bd60 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2bd70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2bd80 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
2bd90 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
2bda0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
2bdb0 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
2bdc0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2bdd0 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2bde0 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20  (pPg); .    if( 
2bdf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2be00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2be10 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
2be20 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20  r, pPg, 0, 0);. 
2be30 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2be40 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2be50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
2be60 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2be70 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
2be80 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2be90 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
2bea0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2beb0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
2bec0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
2bed0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2bee0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  ager, 1);.    }.
2bef0 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
2bf00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2bf10 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
2bf20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2bf30 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
2bf40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bf50 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
2bf60 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2bf70 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2bf80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2bf90 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2bfa0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
2bfb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
2bfc0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
2bfd0 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
2bfe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bff0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2c000 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
2c010 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2c020 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2c030 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
2c040 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2c050 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
2c060 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
2c070 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a  pPager, rc); .}.
2c080 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c  ./*.** Flush all
2c090 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69   unreferenced di
2c0a0 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69 73  rty pages to dis
2c0b0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
2c0c0 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67 65  3PagerFlush(Page
2c0d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2c0e0 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65  t rc = pPager->e
2c0f0 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d  rrCode;.  if( !M
2c100 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
2c110 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r *pList = sqlit
2c120 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2c130 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2c140 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
2c150 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
2c160 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
2c170 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2c180 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
2c190 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
2c1a0 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pNext = pList->p
2c1b0 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28  Dirty;.      if(
2c1c0 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20   pList->nRef==0 
2c1d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2c1e0 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f 69  pagerStress((voi
2c1f0 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74  d*)pPager, pList
2c200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c210 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
2c220 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2c230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c240 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
2c250 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
2c260 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
2c270 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
2c280 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
2c290 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
2c2a0 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
2c2b0 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
2c2c0 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
2c2d0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
2c2e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
2c2f0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
2c300 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
2c310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2c320 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
2c330 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
2c340 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
2c350 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
2c360 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
2c370 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
2c380 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
2c390 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
2c3a0 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
2c3b0 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
2c3c0 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
2c3d0 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
2c3e0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
2c3f0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
2c400 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2c410 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
2c420 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
2c430 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
2c440 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
2c450 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
2c460 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
2c470 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
2c480 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
2c490 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
2c4a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2c4b0 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
2c4c0 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
2c4d0 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
2c4e0 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
2c4f0 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
2c500 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
2c510 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
2c520 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
2c530 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
2c540 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
2c550 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
2c560 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
2c570 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
2c580 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
2c590 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
2c5a0 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
2c5b0 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
2c5c0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
2c5d0 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  R_* flags..**.**
2c5e0 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
2c5f0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
2c600 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
2c610 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2c620 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
2c630 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
2c640 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
2c650 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
2c660 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
2c670 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
2c680 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
2c690 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
2c6a0 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
2c6b0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
2c6c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2c6d0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
2c6e0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
2c6f0 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
2c700 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
2c710 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
2c720 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
2c730 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
2c740 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
2c750 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
2c760 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
2c770 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
2c780 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
2c790 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
2c7a0 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
2c7b0 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
2c7c0 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
2c7d0 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
2c7e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2c7f0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
2c800 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2c810 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2c820 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
2c830 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
2c840 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
2c850 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
2c860 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2c870 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2c880 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2c890 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
2c8a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2c8b0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
2c8c0 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
2c8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2c8e0 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
2c8f0 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2c900 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2c910 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c920 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
2c930 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
2c940 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
2c950 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
2c960 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
2c970 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
2c980 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
2c990 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
2c9a0 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
2c9b0 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
2c9c0 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
2c9d0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
2c9e0 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
2c9f0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
2ca00 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
2ca10 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
2ca20 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
2ca30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2ca40 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ca50 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
2ca60 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
2ca70 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
2ca80 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
2ca90 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
2caa0 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
2cab0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2cac0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2cad0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
2cae0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
2caf0 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
2cb00 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2cb10 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
2cb20 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
2cb30 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
2cb40 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2cb50 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
2cb60 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
2cb70 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
2cb80 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
2cb90 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
2cba0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2cbb0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
2cbc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2cbd0 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
2cbe0 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
2cbf0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
2cc00 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
2cc10 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
2cc20 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
2cc30 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63  rnal */.  int pc
2cc40 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2cc50 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2cc60 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2cc70 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2cc80 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2cc90 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2cca0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2ccb0 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2ccc0 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2ccd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2cce0 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2ccf0 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2cd00 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2cd20 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2cd30 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2cd40 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2cd50 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2cd60 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2cd70 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2cd80 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2cd90 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2cda0 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2cdb0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2cdc0 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2cdd0 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61  l).  */.  journa
2cde0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2cdf0 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
2ce00 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20  lSize(pVfs));.. 
2ce10 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
2ce20 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
2ce30 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65  ULL in case an e
2ce40 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
2ce50 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
2ce60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ce70 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
2ce80 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45  if( flags & PAGE
2ce90 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  R_MEMORY ){.    
2cea0 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69  memDb = 1;.    i
2ceb0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2cec0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2ced0 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20        zPathname 
2cee0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2cef0 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  p(0, zFilename);
2cf00 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68  .      if( zPath
2cf10 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72  name==0  ) retur
2cf20 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2cf30 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68  KPT;.      nPath
2cf40 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2cf50 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2cf60 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  );.      zFilena
2cf70 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
2cf80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
2cf90 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
2cfa0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2cfb0 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
2cfc0 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
2cfd0 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
2cfe0 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
2cff0 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
2d000 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
2d010 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
2d020 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
2d030 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
2d040 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
2d050 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2d060 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2d070 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
2d080 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74  har *z;.    nPat
2d090 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
2d0a0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
2d0b0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2d0c0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
2d0d0 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  , nPathname*2);.
2d0e0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2d0f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2d100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d110 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
2d120 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2d130 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2d140 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2d150 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2d160 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2d170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2d180 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2d190 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2d1a0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2d1b0 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2d1c0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2d1d0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2d1e0 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2d1f0 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2d200 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2d210 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2d220 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2d230 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2d240 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2d250 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2d260 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2d270 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2d280 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2d290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2d2a0 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2d2b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d2c0 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2d2d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2d2e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2d2f0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2d300 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2d310 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2d320 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2d330 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2d340 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2d350 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2d360 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2d370 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2d380 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2d390 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2d3a0 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2d3b0 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2d3c0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2d3d0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2d3e0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2d3f0 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2d400 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2d410 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2d420 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2d440 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2d450 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2d460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d470 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d480 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d490 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d4a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2d4b0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2d4c0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2d4d0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2d4e0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2d4f0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2d500 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2d510 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2d520 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2d530 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2d540 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2d550 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2d560 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2d570 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d590 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2d5a0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d5b0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5d0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2d5e0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2d5f0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2d600 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d610 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2d620 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2d630 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2d640 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2d650 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2d660 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2d670 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2d680 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2d690 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2d6a0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2d6b0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2d6c0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2d6d0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2d6e0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2d6f0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2d700 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2d710 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2d720 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2d730 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2d740 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2d750 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2d760 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2d770 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2d780 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2d790 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d7a0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2d7b0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2d7c0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2d7d0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2d7e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2d7f0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2d800 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d810 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2d820 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2d830 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2d840 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d850 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2d860 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2d870 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2d880 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d890 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2d8a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d8b0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2d8c0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2d8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2d8e0 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2d8f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d900 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d910 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2d920 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2d930 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2d940 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2d950 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d960 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2d970 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d980 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
2d990 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2d9a0 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2d9b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2d9c0 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2d9d0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d9e0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2d9f0 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2da00 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2da10 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2da20 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2da30 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2da40 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2da50 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2da60 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2da70 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2da80 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2da90 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2daa0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2dab0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2dac0 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2dad0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2dae0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2daf0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2db00 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2db10 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2db20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2db30 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2db40 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2db50 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2db60 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2db70 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2db80 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2db90 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2dba0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2dbb0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2dbc0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2dbd0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2dbe0 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2dbf0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2dc00 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2dc10 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2dc20 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2dc30 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2dc40 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2dc50 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2dc60 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2dc70 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2dc80 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2dc90 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2dca0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2dcb0 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2dcc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2dcd0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2dce0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2dcf0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2dd00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dd10 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2dd20 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2dd30 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2dd40 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2dd50 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2dd60 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2dd70 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2dd80 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2dd90 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2dda0 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2ddb0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2ddc0 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2ddd0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2dde0 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2ddf0 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2de00 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2de10 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2de20 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2de30 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2de40 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2de50 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2de60 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2de70 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2de80 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2de90 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2dea0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2deb0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2dec0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2ded0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2dee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2def0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2df00 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2df10 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2df20 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2df30 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20  ert( !memDb );. 
2df40 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
2df50 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2df60 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
2df70 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
2df80 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
2df90 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
2dfa0 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
2dfb0 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
2dfc0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2dfd0 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
2dfe0 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
2dff0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2e000 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
2e010 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
2e020 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
2e030 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
2e040 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2e050 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
2e060 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
2e070 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2e080 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
2e090 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
2e0a0 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
2e0b0 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
2e0c0 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
2e0d0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2e0e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e0f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
2e100 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
2e110 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2e120 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
2e130 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f        if( !readO
2e140 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nly ){.        s
2e150 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2e160 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
2e170 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2e180 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
2e190 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2e1a0 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
2e1b0 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2e1c0 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2e1d0 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2e1e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2e1f0 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
2e200 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2e210 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
2e220 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2e230 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
2e240 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2e250 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
2e260 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2e270 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33  szPageDflt = (u3
2e280 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  2)pPager->sector
2e290 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2e2a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64  }.        }.#ifd
2e2b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2e2c0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2e2d0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2e2e0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2e2f0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2e300 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
2e310 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
2e320 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2e330 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2e340 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
2e350 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2e360 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
2e370 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2e380 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
2e390 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2e3a0 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2e3b0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2e3c0 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2e3d0 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
2e3e0 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
2e3f0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
2e400 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
2e410 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e420 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2e430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e440 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
2e450 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
2e460 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2e470 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  = sqlite3_uri_bo
2e480 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2e490 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20   "nolock", 0);. 
2e4a0 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20       if( (iDc & 
2e4b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d  SQLITE_IOCAP_IMM
2e4c0 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20  UTABLE)!=0.     
2e4d0 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69    || sqlite3_uri
2e4e0 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2e4f0 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c  me, "immutable",
2e500 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
2e510 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c   vfsFlags |= SQL
2e520 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e530 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
2e540 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f  o act_like_temp_
2e550 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  file;.      }.  
2e560 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2e570 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2e580 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2e590 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2e5a0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2e5b0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2e5c0 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2e5d0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2e5e0 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2e5f0 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2e600 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2e610 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2e620 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2e630 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2e640 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2e650 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2e660 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2e670 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2e680 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2e690 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2e6a0 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2e6b0 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2e6c0 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2e6d0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2e6e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2e6f0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2e700 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2e710 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72  is branch also r
2e720 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61  uns for files ma
2e730 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c  rked as immutabl
2e740 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c  e..    */ .act_l
2e750 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20  ike_temp_file:. 
2e760 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
2e770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2e780 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2e790 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65  ER;     /* Prete
2e7a0 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  nd we already ha
2e7b0 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ve a lock */.   
2e7c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2e7d0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2e7e0 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2e7f0 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49  e are in EXCLUSI
2e800 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70  VE mode */.    p
2e810 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20  Pager->noLock = 
2e820 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2e830 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69    /* Do no locki
2e840 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e  ng */.    readOn
2e850 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
2e860 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2e870 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
2e880 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
2e890 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
2e8a0 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
2e8b0 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
2e8c0 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
2e8d0 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
2e8e0 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
2e8f0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
2e900 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
2e910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e920 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e930 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
2e940 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e950 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
2e960 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
2e970 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
2e980 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
2e990 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
2e9a0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e9b0 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2e9c0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  t. */.  if( rc==
2e9d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e9e0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
2e9f0 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74  1000 );.    nExt
2ea00 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
2ea10 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ra);.    rc = sq
2ea20 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
2ea30 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
2ea40 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
2ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea60 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53     !memDb?pagerS
2ea70 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a  tress:0, (void *
2ea80 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  )pPager, pPager-
2ea90 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
2eaa0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2eab0 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c   occurred above,
2eac0 20 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72   free the  Pager
2ead0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
2eae0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
2eaf0 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51   */.  if( rc!=SQ
2eb00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2eb10 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
2eb20 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
2eb30 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
2eb40 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
2eb50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2eb60 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
2eb70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2eb80 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2eb90 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
2eba0 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
2ebb0 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
2ebc0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
2ebd0 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
2ebe0 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
2ebf0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2ec00 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
2ec10 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
2ec20 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f  )useJournal;.  /
2ec30 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
2ec40 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
2ec50 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
2ec60 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2ec70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
2ec80 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ec90 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
2eca0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2ecb0 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
2ecc0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
2ecd0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
2ece0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
2ecf0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
2ed00 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
2ed10 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2ed20 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a  _UNLOCK; */.  /*
2ed30 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2ed40 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2ed50 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2ed60 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2ed70 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2ed80 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ed90 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2eda0 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2edb0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2edc0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2edd0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2ede0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2edf0 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2ee00 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2ee10 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2ee20 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2ee30 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2ee40 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ee50 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2ee60 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2ee70 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2ee80 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2ee90 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2eea0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2eeb0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2eec0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2eed0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2eee0 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
2eef0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2ef00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ef10 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  fullSync==0 );. 
2ef20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ef30 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20  r->extraSync==0 
2ef40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ef50 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2ef60 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2ef70 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t( pPager->walSy
2ef80 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2ef90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2efa0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d  ->ckptSyncFlags=
2efb0 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
2efc0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
2efd0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
2efe0 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
2eff0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
2f000 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
2f010 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2f020 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
2f030 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2f040 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
2f050 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
2f060 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65  TIONS;.    pPage
2f070 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2f080 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2f090 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
2f0a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2f0b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f0c0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2f0d0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f0e0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2f0f0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2f100 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2f110 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2f120 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2f130 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2f140 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2f150 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2f160 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f170 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2f180 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2f190 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2f1a0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2f1b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2f1c0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2f1d0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2f1e0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2f1f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2f200 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2f210 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2f220 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2f230 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2f240 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2f250 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2f260 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2f270 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2f280 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2f290 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2f2a0 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2f2b0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2f2c0 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
2f2d0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
2f2e0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2f2f0 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
2f300 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
2f310 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
2f320 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2f330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f340 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
2f350 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2f360 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
2f370 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
2f380 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  med out from.** 
2f390 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e  under the pager.
2f3a0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2f3b0 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61  OK if the databa
2f3c0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65  se is still were
2f3d0 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20   it ought.** to 
2f3e0 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74  be on disk.  Ret
2f3f0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51  urn non-zero (SQ
2f400 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2f410 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74  MOVED or some ot
2f420 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  her error.** cod
2f430 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73  e from sqlite3Os
2f440 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65  Access()) if the
2f450 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f   database has go
2f460 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73  ne missing..*/.s
2f470 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61  tatic int databa
2f480 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65  seIsUnmoved(Page
2f490 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2f4a0 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b  t bHasMoved = 0;
2f4b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2f4c0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2f4d0 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
2f4e0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
2f4f0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29  ger->dbSize==0 )
2f500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f510 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
2f520 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26  ger->zFilename &
2f530 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  & pPager->zFilen
2f540 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d  ame[0] );.  rc =
2f550 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
2f560 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
2f570 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  , SQLITE_FCNTL_H
2f580 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d  AS_MOVED, &bHasM
2f590 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  oved);.  if( rc=
2f5a0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
2f5b0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2f5c0 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65  e HAS_MOVED file
2f5d0 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d  -control is unim
2f5e0 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d  plemented, assum
2f5f0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a  e that the file.
2f600 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
2f610 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74  een moved.  That
2f620 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63   is the historic
2f630 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53  al behavior of S
2f640 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a  QLite: prior to.
2f650 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
2f660 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63  .8.3, it never c
2f670 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63  hecked */.    rc
2f680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f690 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2f6a0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d  LITE_OK && bHasM
2f6b0 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  oved ){.    rc =
2f6c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2f6d0 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20  _DBMOVED;.  }.  
2f6e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2f6f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f700 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2f710 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2f720 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2f730 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2f740 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2f750 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2f760 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2f770 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2f780 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2f790 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2f7a0 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2f7b0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2f7c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2f7d0 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2f7e0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2f7f0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2f800 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2f810 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2f820 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2f830 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2f840 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2f850 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2f860 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2f870 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2f880 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2f890 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2f8a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2f8b0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2f8c0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2f8d0 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2f8e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2f8f0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2f900 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2f910 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2f920 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f930 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2f940 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2f950 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2f960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f970 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2f980 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2f990 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2f9a0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2f9b0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2f9c0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2f9d0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2f9e0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2f9f0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2fa00 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2fa10 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2fa20 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2fa30 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2fa40 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2fa50 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2fa60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2fa70 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2fa80 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2fa90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2faa0 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2fab0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2fac0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2fad0 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2fae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2faf0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2fb00 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2fb10 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2fb20 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2fb30 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2fb40 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2fb50 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2fb60 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2fb70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2fb80 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2fb90 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2fba0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2fbb0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2fbc0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2fbd0 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2fbe0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2fbf0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2fc00 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2fc10 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2fc20 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2fc30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2fc40 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2fc50 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2fc60 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2fc70 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2fc80 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2fc90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2fca0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2fcb0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2fcc0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2fcd0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2fce0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2fcf0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2fd00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2fd10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2fd20 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2fd30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2fd40 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2fd50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2fd60 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2fd70 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2fd80 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2fd90 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2fda0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2fdb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2fdc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2fdd0 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2fde0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2fdf0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2fe00 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2fe10 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2fe20 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2fe30 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2fe40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2fe50 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2fe60 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2fe70 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2fe80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2fe90 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2fea0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2feb0 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2fec0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2fed0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2fee0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2fef0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2ff00 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2ff10 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2ff20 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2ff30 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2ff40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2ff50 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2ff60 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2ff70 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2ff80 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2ff90 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2ffa0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2ffb0 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2ffc0 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2ffd0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ffe0 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2fff0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
30000 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
30010 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
30020 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
30030 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
30040 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
30050 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
30060 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
30070 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
30080 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
30090 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
300a0 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
300b0 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
300c0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
300d0 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
300e0 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
300f0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
30100 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
30110 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
30120 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
30130 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
30140 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
30150 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
30160 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
30170 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
30180 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
30190 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
301a0 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
301b0 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
301c0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
301d0 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
301e0 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
301f0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
30200 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
30210 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
30220 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
30230 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
30240 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30250 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
30260 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
30270 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
30280 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30290 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
302a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
302b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
302c0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
302d0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
302e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
302f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
30300 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
30310 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20  s zero pages in 
30320 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  size, that means
30330 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29   that either (1)
30340 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
30350 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d  journal is a rem
30360 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f  nant from a prio
30370 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  r database with 
30380 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68  the same name wh
30390 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ere.        ** t
303a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
303b0 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75   but not the jou
303c0 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64  rnal was deleted
303d0 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69  , or (2) the ini
303e0 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  tial.        ** 
303f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
30400 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77   populates a new
30410 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69   database is bei
30420 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ng rolled back..
30430 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69          ** In ei
30440 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a  ther case, the j
30450 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20  ournal file can 
30460 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77  be deleted.  How
30470 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a  ever, take care.
30480 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74          ** not t
30490 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
304a0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
304b0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
304c0 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  due to.        *
304d0 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  * journal_mode=P
304e0 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20  ERSIST..        
304f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  */.        if( n
30500 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c  Page==0 && !jrnl
30510 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
30520 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
30530 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
30540 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
30550 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
30560 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
30570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30580 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30590 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
305a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
305b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
305c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
305d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
305e0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
305f0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
30600 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
30620 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
30630 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
30640 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
30650 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
30660 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
30670 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
30680 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
30690 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
306a0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
306b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
306c0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
306d0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
306e0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
306f0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
30700 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
30710 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30720 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
30730 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
30740 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
30750 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
30760 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
30770 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
30780 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
30790 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
307a0 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
307b0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
307c0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
307d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
307e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
307f0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
30800 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30810 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
30820 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
30830 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
30840 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
30850 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
30860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30870 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
30880 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
30890 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
308a0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
308b0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
308c0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
308d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
308e0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
308f0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
30900 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
30920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30930 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
30940 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
30950 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
30960 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
30970 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30980 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
30990 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
309a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
309b0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
309c0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
309d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
309e0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
309f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
30a00 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
30a10 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
30a20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
30a30 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
30a40 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
30a50 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
30a60 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
30a70 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
30a80 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
30a90 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
30aa0 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
30ab0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
30ac0 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
30ad0 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
30ae0 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
30af0 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
30b00 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
30b10 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
30b20 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
30b30 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
30b40 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
30b50 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
30b60 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
30b70 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
30b80 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
30b90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
30ba0 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
30bb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
30bc0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
30bd0 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
30be0 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
30bf0 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
30c00 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
30c10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30c20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
30c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30c40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30c60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30c70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
30c80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
30c90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30ca0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
30cb0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
30cc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30cd0 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
30ce0 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
30cf0 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74  e3PagerGet() unt
30d00 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
30d10 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
30d20 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
30d30 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
30d40 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
30d50 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
30d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30d70 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
30d80 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
30d90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
30da0 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
30db0 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
30dc0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
30dd0 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
30de0 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
30df0 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  y in PAGER_OPEN 
30e00 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
30e10 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
30e20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30e30 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
30e40 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
30e50 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
30e60 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
30e70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30e80 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
30e90 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
30ea0 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
30eb0 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
30ec0 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
30ed0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
30ee0 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
30ef0 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
30f00 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
30f10 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
30f20 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
30f30 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
30f40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
30f50 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
30f60 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
30f70 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
30f80 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
30f90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30fa0 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
30fb0 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
30fc0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
30fd0 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
30fe0 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
30ff0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
31000 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
31010 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
31020 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
31030 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
31040 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
31050 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
31060 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
31070 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
31080 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
31090 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
310a0 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
310b0 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
310c0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
310d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
310e0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
310f0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
31100 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
31110 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
31120 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
31130 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
31140 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
31150 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
31160 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
31170 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
31180 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
31190 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
311a0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a  urnal file or .*
311b0 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  * rolling back a
311c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
311d0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
311e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
311f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31200 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
31210 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
31220 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31240 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
31250 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
31260 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
31270 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
31280 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
31290 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
312a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
312b0 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73  es. This implies
312c0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
312d0 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74  state should eit
312e0 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e  her.  ** be OPEN
312f0 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44   or READER. READ
31300 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ER is only possi
31310 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72  ble if the pager
31320 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20   is or was in . 
31330 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
31340 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20  cess mode.  */. 
31350 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31360 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
31370 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
31380 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
31390 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
313a0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
313b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
313c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
313d0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
313e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
313f0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
31400 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
31410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
31420 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
31430 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
31440 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
31450 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
31460 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
31470 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
31480 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
31490 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
314a0 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
314b0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
314c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
314d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
314e0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
314f0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
31500 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  CK );..    rc = 
31510 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
31520 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
31530 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
31540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31550 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
31560 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
31570 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
31580 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
31590 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67  _LOCK );.      g
315a0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
315b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  }..    /* If a j
315c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
315d0 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
315e0 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
315f0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
31600 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
31610 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
31620 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
31630 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
31640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31650 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d   pPager->eLock<=
31660 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
31670 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
31680 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
31690 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  &bHotJournal);. 
316a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
316b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
316c0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
316d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
316e0 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
316f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
31700 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
31710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31720 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
31730 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  K;.        goto 
31740 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
31750 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
31760 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
31770 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31780 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
31790 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
317a0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
317b0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
317c0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
317d0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
317e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
317f0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
31800 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
31810 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
31820 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
31830 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
31840 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
31850 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
31860 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
31870 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
31880 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
31890 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
318a0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
318b0 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
318c0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
318d0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
318e0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
318f0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
31900 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
31910 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
31920 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
31930 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
31940 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
31950 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
31960 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
31970 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
31980 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31990 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
319a0 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
319b0 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
319c0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
319d0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
319e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
319f0 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
31a00 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
31a10 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
31a20 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
31a30 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
31a40 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
31a50 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
31a60 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
31a70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
31a80 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
31a90 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
31aa0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
31ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31ac0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
31ad0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
31ae0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
31af0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
31b00 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
31b10 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
31b20 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
31b30 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
31b40 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
31b50 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
31b60 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
31b70 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
31b80 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
31b90 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
31ba0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
31bb0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
31bc0 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
31bd0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
31be0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
31bf0 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
31c00 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
31c10 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
31c20 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
31c30 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
31c40 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
31c50 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
31c60 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
31c70 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
31c80 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
31c90 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
31ca0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
31cb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
31cc0 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
31cd0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
31ce0 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
31cf0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
31d00 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
31d10 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
31d20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
31d30 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
31d40 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
31d50 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
31d60 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
31d70 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
31d80 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
31d90 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
31da0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
31db0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
31dc0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
31dd0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
31de0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
31df0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
31e00 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
31e10 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
31e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31e30 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
31e40 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
31e50 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
31e60 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
31e70 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
31e80 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
31e90 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
31ea0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
31eb0 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
31ec0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
31ed0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
31ee0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
31ef0 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
31f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31f10 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
31f20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
31f30 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
31f40 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
31f50 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
31f60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31f70 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
31f80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
31f90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
31fa0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31fb0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
31fc0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
31fd0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
31fe0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
31ff0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
32010 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32020 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
32030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32040 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
32050 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
32060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32070 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
32080 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
32090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
320a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
320b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
320c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
320d0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
320e0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
320f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
32100 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
32110 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
32120 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
32130 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
32140 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
32150 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
32160 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
32170 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
32180 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
32190 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
321a0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
321b0 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
321c0 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
321d0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
321e0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
321f0 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
32200 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
32210 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
32220 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
32230 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
32240 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
32250 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
32260 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
32270 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
32280 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
32290 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
322a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
322b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
322c0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
322d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
322e0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
322f0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
32300 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
32310 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32330 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
32340 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
32350 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  er, !pPager->tem
32360 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
32370 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
32380 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
32390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
323a0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
323b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
323c0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
323d0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
323e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
323f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32400 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32410 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
32420 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
32430 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
32440 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
32450 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
32460 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
32470 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
32480 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
32490 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
324a0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
324b0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
324c0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
324d0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
324e0 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
324f0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
32500 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
32510 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
32520 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
32530 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
32540 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
32550 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
32560 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
32570 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
32580 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
32590 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
325a0 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
325b0 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
325c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
325d0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
325e0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
325f0 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
32600 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
32610 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
32620 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
32630 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
32640 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
32650 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
32660 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
32670 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
32680 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
32690 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
326a0 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
326b0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
326c0 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
326d0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
326e0 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
326f0 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
32700 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
32710 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
32720 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
32730 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
32740 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
32750 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
32760 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
32770 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
32780 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
32790 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
327a0 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
327b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
327c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
327d0 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
327e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
327f0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
32800 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
32810 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
32820 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
32830 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
32840 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
32850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
32860 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
32870 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
32880 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
32890 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
328a0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
328b0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
328c0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
328d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
328e0 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65  empFile && pPage
328f0 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
32900 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
32910 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
32920 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
32930 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65  cquired then che
32940 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ck to.      ** s
32950 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
32960 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
32970 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
32980 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
32990 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75  ed,.      ** flu
329a0 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
329b0 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64  he hasHeldShared
329c0 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e  Lock flag preven
329d0 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  ts this from.   
329e0 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20     ** occurring 
329f0 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73  on the very firs
32a00 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69  t access to a fi
32a10 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  le, in order to 
32a20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
32a30 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61  single unnecessa
32a40 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  ry sqlite3OsRead
32a50 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73  () call at the s
32a60 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a  tart-up..      *
32a70 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
32a80 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  ase changes are 
32a90 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
32aa0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
32ab0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
32ac0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
32ad0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
32ae0 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
32af0 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
32b00 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
32b10 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
32b20 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
32b30 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
32b40 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
32b50 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
32b60 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
32b70 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
32b80 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
32b90 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
32ba0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
32bb0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
32bc0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
32bd0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
32be0 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
32bf0 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
32c00 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
32c10 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
32c20 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
32c30 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
32c40 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
32c50 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
32c60 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   */.      Pgno n
32c70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
32c80 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
32c90 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
32ca0 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20  bFileVers)];..  
32cb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
32cc0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
32cd0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
32ce0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69  f( rc ) goto fai
32cf0 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  led;..      if( 
32d00 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20  nPage>0 ){.     
32d10 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
32d20 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
32d30 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
32d40 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
32d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32d60 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
32d70 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20  d, &dbFileVers, 
32d80 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
32d90 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  s), 24);.       
32da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32db0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
32dc0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
32dd0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  D ){.          g
32de0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
32df0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
32e00 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
32e10 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
32e20 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32e30 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
32e40 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
32e50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
32e60 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
32e70 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
32e80 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
32e90 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
32ea0 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
32eb0 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74  /* Unmap the dat
32ec0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69  abase file. It i
32ed0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
32ee0 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73  external process
32ef0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  es.        ** ma
32f00 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64  y have truncated
32f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32f20 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65  le and then exte
32f30 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20  nded it back.   
32f40 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f       ** to its o
32f50 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69  riginal size whi
32f60 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
32f70 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20  was not holding 
32f80 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  a lock..        
32f90 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
32fa0 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20  there may exist 
32fb0 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70  a Pager.pMap map
32fc0 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72  ping that appear
32fd0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  s.        ** to 
32fe0 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  be the right siz
32ff0 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74  e but is not act
33000 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f  ually valid. Avo
33010 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  id this.        
33020 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62  ** possibility b
33030 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20  y unmapping the 
33040 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  db here. */.    
33050 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
33060 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
33070 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
33080 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
33090 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
330a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
330b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
330c0 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65  re is a WAL file
330d0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
330e0 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64  tem, open this d
330f0 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20  atabase in WAL. 
33100 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65     ** mode. Othe
33110 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  rwise, the follo
33120 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  wing function ca
33130 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
33140 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
33150 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
33160 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69  sent(pPager);.#i
33170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33180 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74  T_WAL.    assert
33190 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
331a0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
331b0 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  OK );.#endif.  }
331c0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
331d0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
331e0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
331f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
33200 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
33210 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
33220 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
33230 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
33240 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ile==0 && pPager
33250 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33260 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49  OPEN && rc==SQLI
33270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
33280 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
33290 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
332a0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
332b0 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
332c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
332d0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
332e0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
332f0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
33300 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33310 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33320 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73  R_OPEN );.  }els
33330 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
33340 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
33350 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72  ADER;.    pPager
33360 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
33370 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ock = 1;.  }.  r
33380 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33390 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
333a0 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
333b0 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
333c0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
333d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
333e0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
333f0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
33400 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
33410 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
33420 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
33430 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
33440 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
33450 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
33460 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
33470 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
33480 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
33490 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
334a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
334b0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
334c0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
334d0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
334e0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
334f0 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20  >nMmapOut==0 && 
33500 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
33510 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
33520 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20  PCache)==0) ){. 
33530 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
33540 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
33550 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
33560 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
33570 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
33580 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
33590 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
335a0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
335b0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
335c0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
335d0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
335e0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
335f0 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
33600 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
33610 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
33620 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
33630 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
33640 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
33650 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
33660 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
33670 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
33680 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
33690 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
336a0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
336b0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
336c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
336d0 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
336e0 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
336f0 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
33700 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
33710 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
33720 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
33730 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
33740 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
33750 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
33760 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
33770 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
33780 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
33790 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
337a0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
337b0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
337c0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
337d0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
337e0 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
337f0 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
33800 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
33810 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
33820 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
33830 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
33840 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
33850 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
33860 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
33870 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
33880 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
33890 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
338a0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
338b0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
338c0 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
338d0 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
338e0 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
338f0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
33900 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
33910 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
33920 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
33930 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
33940 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
33950 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
33960 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
33970 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
33980 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
33990 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
339a0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
339b0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
339c0 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
339d0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
339e0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
339f0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
33a00 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
33a10 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e  curs in two scen
33a20 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
33a30 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
33a40 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
33a50 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
33a60 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
33a70 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
33a80 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
33a90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
33aa0 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
33ab0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
33ac0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
33ad0 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
33ae0 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
33af0 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
33b00 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
33b10 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
33b20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
33b30 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
33b40 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
33b50 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
33b60 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
33b70 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
33b80 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
33b90 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
33ba0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
33bb0 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
33bc0 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
33bd0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
33be0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
33bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
33c00 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33c10 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
33c20 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
33c30 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
33c40 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
33c50 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
33c60 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
33c70 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
33c80 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
33c90 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
33ca0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
33cb0 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
33cc0 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
33cd0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
33ce0 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
33cf0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
33d00 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
33d10 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
33d20 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
33d30 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
33d40 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
33d50 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
33d60 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
33d70 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
33d80 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
33d90 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
33da0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
33db0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
33dc0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
33dd0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
33de0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
33df0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
33e00 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
33e10 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
33e20 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
33e30 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
33e40 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
33e50 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
33e60 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
33e70 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
33e80 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
33e90 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
33ea0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
33eb0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
33ec0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
33ed0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
33ee0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
33ef0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
33f00 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
33f10 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
33f20 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
33f30 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
33f40 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
33f50 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
33f60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
33f70 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
33f80 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
33f90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
33fa0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
33fb0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
33fc0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
33fd0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
33fe0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
33ff0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
34000 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
34010 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
34020 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
34030 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
34040 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34050 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
34060 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72  g = 0;.  u32 iFr
34070 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
34080 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d           /* Fram
34090 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57  e to read from W
340a0 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e  AL file */.  con
340b0 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  st int noContent
340c0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
340d0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
340e0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63  ;..  /* It is ac
340f0 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20  ceptable to use 
34100 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61  a read-only (mma
34110 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20  p) page for any 
34120 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a  page except.  **
34130 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65   page 1 if there
34140 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
34150 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72  nsaction open or
34160 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41   the ACQUIRE_REA
34170 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20  DONLY.  ** flag 
34180 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79  was specified by
34190 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64   the caller. And
341a0 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   so long as the 
341b0 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a  db is not a .  *
341c0 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  * temporary or i
341d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
341e0 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  e.  */.  const i
341f0 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67  nt bMmapOk = (pg
34200 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43 48  no>1 && USEFETCH
34210 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20 28  (pPager).   && (
34220 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
34230 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20  PAGER_READER || 
34240 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
34250 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69  ET_READONLY)).#i
34260 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
34270 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61 67  CODEC.   && pPag
34280 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65  er->xCodec==0.#e
34290 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  ndif.  );..  /* 
342a0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74  Optimization not
342b0 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22  e:  Adding the "
342c0 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65  pgno<=1" term be
342d0 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68  fore "pgno==0" h
342e0 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20  ere.  ** allows 
342f0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
34300 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20  imizer to reuse 
34310 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
34320 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a  he "pgno>1".  **
34330 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65   test in the pre
34340 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c  vious statement,
34350 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69   and avoid testi
34360 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68  ng pgno==0 in th
34370 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61  e.  ** common ca
34380 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73  se where pgno is
34390 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28   large. */.  if(
343a0 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f   pgno<=1 && pgno
343b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
343c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
343d0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
343e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
343f0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
34400 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
34410 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
34420 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
34430 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74  ssert( noContent
34440 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d  ==0 || bMmapOk==
34450 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0 );..  assert( 
34460 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
34470 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  haredLock==1 );.
34480 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
34490 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
344a0 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
344b0 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
344c0 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
344d0 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
344e0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
344f0 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
34500 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
34510 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
34520 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
34530 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
34540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
34550 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
34560 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
34570 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
34580 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
34590 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
345a0 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b   pgno, &iFrame);
345b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
345c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
345d0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
345e0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
345f0 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72  ( bMmapOk && iFr
34600 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
34610 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
34620 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
34630 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67  ite3OsFetch(pPag
34640 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
34650 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29     (i64)(pgno-1)
34660 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
34670 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ize, pPager->pag
34680 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20  eSize, &pData.  
34690 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
346a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
346b0 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  && pData ){.    
346c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
346d0 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41  eState>PAGER_REA
346e0 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  DER || pPager->t
346f0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
34700 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
34710 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
34720 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
34730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
34740 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
34750 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
34760 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
34770 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44  pPager, pgno, pD
34780 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ata, &pPg);.    
34790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
347a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
347b0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
347c0 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a  , (i64)(pgno-1)*
347d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
347e0 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
347f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34800 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pPg ){.         
34810 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
34820 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
34830 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
34840 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  g;.          ret
34850 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
34860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34870 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34890 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
348a0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
348b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b    }.    }..    {
348c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70  .      sqlite3_p
348d0 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73  cache_page *pBas
348e0 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d  e;.      pBase =
348f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34900 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
34910 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20  che, pgno, 3);. 
34920 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d       if( pBase==
34930 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
34940 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
34950 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65  etchStress(pPage
34960 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
34970 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20  , &pBase);.     
34980 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34990 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
349a0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
349b0 20 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65         if( pBase
349c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
349d0 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
349e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
349f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
34a00 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
34a10 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34a20 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20  re_err;.        
34a30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
34a40 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
34a50 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34a60 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
34a70 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34a80 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73  pBase);.      as
34a90 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a  sert( pPg!=0 );.
34aa0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
34ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34ac0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
34ad0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
34ae0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
34af0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
34b00 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
34b10 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
34b20 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
34b30 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
34b40 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
34b50 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
34b60 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
34b70 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
34b80 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
34b90 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
34ba0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34bb0 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
34bc0 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70  ssert( pPg==(*pp
34bd0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
34be0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67  t( pPg->pgno==pg
34bf0 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
34c00 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
34c10 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67  ger || pPg->pPag
34c20 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  er==0 );..  if( 
34c30 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21  pPg->pPager && !
34c40 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
34c50 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
34c60 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
34c70 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
34c80 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
34c90 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
34ca0 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
34cb0 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
34cc0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
34cd0 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
34ce0 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
34cf0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34d00 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67  ger) );.    pPag
34d10 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
34d20 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20  STAT_HIT]++;.   
34d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34d40 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
34d50 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
34d60 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
34d70 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
34d80 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
34d90 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
34da0 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20  ialized.  */..  
34db0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
34dc0 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
34dd0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
34de0 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
34df0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
34e00 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
34e10 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
34e20 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
34e30 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
34e40 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
34e50 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
34e60 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
34e70 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
34e80 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
34e90 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
34ea0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
34eb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
34ec0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34ed0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
34ee0 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
34ef0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
34f00 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
34f10 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
34f20 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
34f30 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
34f40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
34f50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
34f60 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
34f70 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34f80 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34f90 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
34fa0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
34fb0 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
34fc0 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
34fd0 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
34fe0 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
34ff0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
35000 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
35010 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
35020 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
35030 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
35040 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
35050 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
35060 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
35070 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
35080 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
35090 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
350a0 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
350b0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
350c0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
350d0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
350e0 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
350f0 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
35100 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
35110 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
35120 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
35130 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
35140 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
35150 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
35160 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
35170 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
35180 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
35190 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
351a0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
351b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
351c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
351d0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
351e0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
351f0 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
35200 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
35210 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
35220 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
35230 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
35240 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
35250 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
35260 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
35270 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
35280 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
35290 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
352a0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
352b0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
352c0 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73       if( pagerUs
352d0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
352e0 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20  bMmapOk==0 ){.  
352f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35300 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
35310 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
35320 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
35330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
35340 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
35350 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
35370 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
35380 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
35390 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
353a0 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
353b0 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
353c0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
353d0 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
353e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
353f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
35400 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
35410 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
35420 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
35430 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
35440 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
35450 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
35460 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
35470 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
35480 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
35490 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
354a0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
354b0 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
354c0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
354d0 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
354e0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
354f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
35500 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
35510 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
35520 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
35530 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
35540 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
35550 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
35560 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
35570 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
35580 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
35590 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
355a0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
355b0 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
355c0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
355d0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
355e0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
355f0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
35600 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
35610 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
35620 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
35630 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
35640 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
35650 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
35660 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
35670 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
35680 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
35690 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
356a0 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
356b0 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
356c0 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
356d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
356e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
356f0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71  Pgno pgno){.  sq
35700 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
35710 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
35720 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
35730 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
35740 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
35750 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
35760 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
35770 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
35780 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
35790 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  he, pgno, 0);.  
357a0 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30  assert( pPage==0
357b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48   || pPager->hasH
357c0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b  eldSharedLock );
357d0 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
357e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
357f0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
35800 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
35810 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
35820 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a  gno, pPage);.}..
35830 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
35840 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
35850 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
35860 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
35870 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
35880 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
35890 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
358a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
358b0 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
358c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
358d0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
358e0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
358f0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
35900 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
35910 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
35920 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
35930 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35940 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
35950 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
35960 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
35970 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPg!=0 );.  pP
35980 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
35990 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  er;.  if( pPg->f
359a0 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
359b0 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65  P ){.    pagerRe
359c0 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
359d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
359e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
359f0 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
35a00 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
35a10 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
35a20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
35a30 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
35a40 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
35a50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35a60 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
35a70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
35a80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
35a90 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
35aa0 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
35ab0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
35ac0 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
35ad0 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
35ae0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
35af0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35b00 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
35b10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
35b20 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
35b30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35b40 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
35b50 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
35b60 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
35b70 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35b80 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
35b90 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
35ba0 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
35bb0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
35bc0 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
35bd0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
35be0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
35bf0 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
35c00 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
35c10 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
35c20 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
35c30 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
35c40 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
35c50 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
35c60 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
35c70 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
35c80 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
35c90 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
35ca0 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
35cb0 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
35cc0 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
35cd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
35ce0 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
35cf0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
35d00 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
35d10 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
35d20 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
35d30 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
35d40 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
35d50 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
35d60 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
35d70 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
35d80 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
35d90 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
35da0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
35db0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
35dc0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
35dd0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
35de0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
35df0 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
35e00 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
35e10 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
35e20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
35e30 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
35e40 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
35e50 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
35e60 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
35e70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
35e80 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
35e90 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35ea0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35eb0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
35ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
35ed0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
35ee0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
35ef0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
35f00 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
35f10 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
35f20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
35f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35f40 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
35f50 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
35f60 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
35f70 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
35f80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35f90 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
35fa0 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
35fb0 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
35fc0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
35fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35fe0 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
35ff0 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
36000 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
36010 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
36020 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
36030 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
36040 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
36050 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36060 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
36070 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
36080 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
36090 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
360a0 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
360b0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
360c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
360d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
360e0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
360f0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
36100 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
36110 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
36120 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
36130 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
36140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
36150 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  T;.    }.  .    
36160 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
36170 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
36180 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
36190 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
361a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
361b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
361c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
361d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
361e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
361f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36200 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
36210 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
36220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36230 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
36240 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
36250 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
36260 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20  _CREATE;.       
36270 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20   int nSpill;..  
36280 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
36290 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
362a0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
362b0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
362c0 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
362d0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
362e0 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  RNAL);.         
362f0 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65   nSpill = sqlite
36300 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  3Config.nStmtSpi
36310 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
36320 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  e{.          fla
36330 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
36340 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
36350 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
36360 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a   = jrnlBufferSiz
36370 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
36380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a     }.          .
36390 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
363a0 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
363b0 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68  ase still has th
363c0 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69  e same name as i
363d0 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20  t did when.     
363e0 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69     ** it was ori
363f0 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20  ginally opened. 
36400 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
36410 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
36420 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  d(pPager);.     
36430 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
36460 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20  urnalOpen (.    
36470 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
36480 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
36490 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
364a0 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20  lags, nSpill.   
364b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
364c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
364d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
364e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
364f0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
36500 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
36510 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
36520 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
36530 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
36540 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
36550 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
36560 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
36570 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
36580 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
365a0 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
365b0 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
365c0 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
365d0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
365e0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
365f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
36600 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
36610 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
36620 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
36630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
36640 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
36650 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
36660 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
36670 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
36680 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
36690 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
366a0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
366b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
366c0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
366d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
366e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
366f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36700 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
36710 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
36720 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
36730 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
36740 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
36750 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
36760 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36770 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
36780 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
36790 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
367a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
367b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
367c0 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
367d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
367e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
367f0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
36800 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
36810 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
36820 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
36830 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36840 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
36850 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
36860 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
36870 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36880 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
36890 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
368a0 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
368b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
368c0 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
368d0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
368e0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
368f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
36900 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
36910 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
36920 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
36930 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
36940 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
36950 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
36960 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
36970 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
36980 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
36990 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
369a0 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
369b0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
369c0 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
369d0 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
369e0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
369f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
36a00 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
36a10 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
36a20 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
36a30 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
36a40 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
36a50 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
36a60 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
36a70 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
36a80 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
36a90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
36aa0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
36ab0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
36ac0 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
36ad0 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
36ae0 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
36af0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
36b00 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
36b10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
36b20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
36b30 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
36b40 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36b50 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
36b60 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
36b70 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
36b80 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
36b90 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
36ba0 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
36bb0 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
36bc0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36bd0 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
36be0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
36bf0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
36c00 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
36c10 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
36c20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
36c30 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
36c40 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
36c50 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
36c60 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
36c70 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
36c80 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36c90 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
36ca0 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
36cb0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
36cc0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
36cd0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
36ce0 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
36cf0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
36d00 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
36d10 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
36d20 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
36d30 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
36d40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
36d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36d60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
36d70 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
36d80 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
36d90 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
36da0 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
36db0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
36dc0 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
36dd0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
36de0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
36df0 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
36e00 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
36e10 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
36e20 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
36e30 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
36e40 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
36e50 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
36e60 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
36e70 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
36e80 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
36e90 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
36ea0 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
36eb0 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
36ec0 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
36ed0 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
36ee0 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
36ef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36f00 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
36f10 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
36f20 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
36f30 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
36f40 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
36f50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36f60 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
36f70 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
36f80 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
36f90 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
36fa0 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
36fb0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
36fc0 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
36fd0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
36fe0 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
36ff0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
37000 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
37010 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
37020 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
37030 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
37040 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
37050 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
37060 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
37070 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
37080 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
37090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
370a0 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
370b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
370c0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
370d0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
370e0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
370f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
37100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37110 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
37120 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
37130 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
37140 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
37150 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
37160 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
37170 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
37180 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
37190 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
371a0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
371b0 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
371c0 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
371d0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
371e0 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
371f0 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
37200 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
37210 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
37220 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
37230 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
37240 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
37250 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
37260 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
37270 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
37280 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
37290 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
372a0 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
372b0 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
372c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
372d0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
372e0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
372f0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
37300 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
37310 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
37320 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
37330 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
37340 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
37350 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
37360 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
37370 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
37380 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37390 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
373a0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
373b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
373c0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
373d0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
373e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
373f0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
37400 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37410 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
37420 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
37430 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37440 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
37450 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
37460 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
37470 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
37480 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
37490 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70  }../*.** Write p
374a0 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65  age pPg onto the
374b0 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c   end of the roll
374c0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
374d0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
374e0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65  OINLINE int page
374f0 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61  rAddPageToRollba
37500 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  ckJournal(PgHdr 
37510 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
37520 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
37530 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
37540 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63    u32 cksum;.  c
37550 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69  har *pData2;.  i
37560 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
37570 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
37580 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
37590 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
375a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
375b0 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a  e page that.  **
375c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
375d0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
375e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
375f0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a  ert verifies.  *
37600 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
37610 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
37620 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
37630 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
37640 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
37650 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
37660 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
37670 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32  lOff );.  CODEC2
37680 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
37690 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
376a0 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
376b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61  _NOMEM_BKPT, pDa
376c0 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20  ta2);.  cksum = 
376d0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
376e0 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
376f0 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20  ;..  /* Even if 
37700 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
37710 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  l error occurs w
37720 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
37730 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
37740 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
37750 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
37760 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
37770 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68  e page..  ** Oth
37780 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
37790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
377a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
377b0 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70   logic in.  ** p
377c0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
377d0 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
377e0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
377f0 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
37800 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  .  ** in the dat
37810 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
37820 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
37830 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
37840 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  g so,.  ** then 
37850 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
37860 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  ollow..  */.  pP
37870 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
37880 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
37890 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
378a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
378b0 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
378c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
378d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
378e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
378f0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
37900 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
37910 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
37920 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  ff+4);.  if( rc!
37930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37940 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77  urn rc;.  rc = w
37950 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
37960 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61  r->jfd, iOff+pPa
37970 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
37980 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72   cksum);.  if( r
37990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
379a0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54  eturn rc;..  IOT
379b0 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
379c0 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
379d0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
379e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61   .           pPa
379f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
37a00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
37a10 65 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  e));.  PAGER_INC
37a20 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
37a30 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
37a40 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
37a50 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
37a60 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
37a70 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
37a80 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
37a90 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
37aa0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
37ab0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
37ac0 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
37ad0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
37ae0 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
37af0 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70  rnalOff += 8 + p
37b00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
37b10 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b  .  pPager->nRec+
37b20 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  +;.  assert( pPa
37b30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
37b40 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
37b50 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
37b60 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37b70 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37b80 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
37b90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
37ba0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
37bb0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
37bc0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
37bd0 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
37be0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
37bf0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
37c00 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
37c10 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
37c20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
37c30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37c40 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
37c50 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
37c60 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
37c70 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
37c80 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
37c90 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
37ca0 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
37cb0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
37cc0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
37cd0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
37ce0 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
37cf0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
37d00 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
37d10 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
37d20 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
37d30 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
37d40 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
37d50 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
37d60 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
37d70 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
37d80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
37d90 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
37da0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
37db0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
37dc0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
37dd0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
37de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
37df0 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
37e00 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
37e10 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
37e20 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
37e30 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
37e40 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
37e50 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
37e60 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
37e70 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
37e80 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
37e90 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
37ea0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37eb0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37ec0 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
37ed0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37ee0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37ef0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
37f00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37f10 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37f20 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
37f30 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37f40 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37f50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
37f60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
37f70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
37f80 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
37f90 3d 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50  ==0 );.  CHECK_P
37fa0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
37fb0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
37fc0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65   needs to be ope
37fd0 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65  ned. Higher leve
37fe0 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  l routines have 
37ff0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74  already.  ** obt
38000 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
38010 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67  ary locks to beg
38020 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  in the write-tra
38030 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68  nsaction, but th
38040 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  e.  ** rollback 
38050 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
38060 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  t yet be open. O
38070 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
38080 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
38090 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
380a0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61  s done before ca
380b0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
380c0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f  cheMakeDirty() o
380d0 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a  n the page. .  *
380e0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
380f0 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74  it were done aft
38100 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  er calling sqlit
38110 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
38120 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  y(), then.  ** a
38130 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63  n error might oc
38140 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65  cur and the page
38150 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69  r would end up i
38160 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
38170 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20  state.  ** with 
38180 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20  pages marked as 
38190 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63  dirty in the cac
381a0 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
381b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
381c0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
381d0 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ED ){.    rc = p
381e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
381f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
38200 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
38210 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
38220 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
38230 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
38240 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
38250 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
38260 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
38270 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
38280 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
38290 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 20 74   that is about t
382a0 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73  o be modified as
382b0 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c   dirty. */.  sql
382c0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
382d0 72 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  rty(pPg);..  /* 
382e0 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  If a rollback jo
382f0 75 72 6e 61 6c 20 69 73 20 69 6e 20 75 73 65 2c  urnal is in use,
38300 20 74 68 65 6d 20 6d 61 6b 65 20 73 75 72 65 20   them make sure 
38310 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73  the page that is
38320 20 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63   about.  ** to c
38330 68 61 6e 67 65 20 69 73 20 69 6e 20 74 68 65 20  hange is in the 
38340 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
38350 2c 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  , or if the page
38360 20 69 73 20 61 20 6e 65 77 20 70 61 67 65 20 6f   is a new page o
38370 66 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64  ff.  ** then end
38380 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 6d 61   of the file, ma
38390 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6d 61  ke sure it is ma
383a0 72 6b 65 64 20 61 73 20 50 47 48 44 52 5f 4e 45  rked as PGHDR_NE
383b0 45 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20  ED_SYNC..  */.  
383c0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
383d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20  >pInJournal!=0) 
383e0 3d 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  == isOpen(pPager
383f0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
38400 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
38410 61 6c 21 3d 30 0a 20 20 20 26 26 20 73 71 6c 69  al!=0.   && sqli
38420 74 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74  te3BitvecTestNot
38430 4e 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e  Null(pPager->pIn
38440 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
38450 6e 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  no)==0.  ){.    
38460 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
38470 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
38480 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
38490 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
384a0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
384b0 20 72 63 20 3d 20 70 61 67 65 72 41 64 64 50 61   rc = pagerAddPa
384c0 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72  geToRollbackJour
384d0 6e 61 6c 28 70 50 67 29 3b 0a 20 20 20 20 20 20  nal(pPg);.      
384e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
384f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
38500 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
38510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38520 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
38530 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
38540 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20  R_DBMOD ){.     
38550 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
38560 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
38570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38580 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
38590 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
385a0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
385b0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
385c0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
385d0 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
385e0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
385f0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
38600 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
38610 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
38620 50 47 48 44 52 5f 44 49 52 54 59 20 62 69 74 20  PGHDR_DIRTY bit 
38630 69 73 20 73 65 74 20 61 62 6f 76 65 20 77 68 65  is set above whe
38640 6e 20 74 68 65 20 70 61 67 65 20 77 61 73 20 61  n the page was a
38650 64 64 65 64 20 74 6f 20 74 68 65 20 64 69 72 74  dded to the dirt
38660 79 2d 6c 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20  y-list.  ** and 
38670 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
38680 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
38690 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
386a0 6c 2e 20 20 57 61 69 74 20 75 6e 74 69 6c 20 6e  l.  Wait until n
386b0 6f 77 2c 0a 20 20 2a 2a 20 61 66 74 65 72 20 74  ow,.  ** after t
386c0 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
386d0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f   successfully jo
386e0 75 72 6e 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65  urnalled, before
386f0 20 73 65 74 74 69 6e 67 20 74 68 65 0a 20 20 2a   setting the.  *
38700 2a 20 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c  * PGHDR_WRITEABL
38710