/ Hex Artifact Content
Login

Artifact 79df56da9dd49aceaa4cac207484a9a82cba40ae:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  f.};../*.** A op
5240: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
5250: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5260: 73 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20  struct Pager. A 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
5280: 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f  * some of the mo
5290: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d  re important mem
52a0: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f  ber variables fo
52b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74  llows:.**.** eSt
52c0: 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ate.**.**   The 
52d0: 63 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20  current 'state' 
52e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
52f0: 65 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  ect. See the com
5300: 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a  ment and state.*
5310: 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76  *   diagram abov
5320: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
5330: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
5340: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c   state..**.** eL
5350: 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ock.**.**   For 
5360: 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64  a real on-disk d
5370: 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72  atabase, the cur
5380: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
5390: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
53a0: 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  ile -.**   NO_LO
53b0: 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
53c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
53d0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
53e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  ..**.**   For a 
53f0: 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
5400: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
5410: 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63  (neither of whic
5420: 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a  h require any.**
5430: 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20     locks), this 
5440: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
5450: 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53  ys set to EXCLUS
5460: 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20  IVE_LOCK. Since 
5470: 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61  such.**   databa
5480: 73 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20  ses always have 
5490: 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d  Pager.exclusiveM
54a0: 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69  ode==1, this tri
54b0: 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  cks the pager.**
54c0: 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68     logic into th
54d0: 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61  inking that it a
54e0: 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74  lready has all t
54f0: 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c  he locks it will
5500: 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20   ever.**   need 
5510: 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74  (and no reason t
5520: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e  o release them).
5530: 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65  .**.**   In some
5540: 20 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75   (obscure) circu
5550: 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76  mstances, this v
5560: 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f  ariable may also
5570: 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20   be set to.**   
5580: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
5590: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
55a0: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
55b0: 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  of UNKNOWN_LOCK 
55c0: 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73  for.**   details
55d0: 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f  ..**.** changeCo
55e0: 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20  untDone.**.**   
55f0: 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72  This boolean var
5600: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
5610: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5620: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5630: 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d  er .**   (the 4-
5640: 62 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c  byte header fiel
5650: 64 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  d at byte offset
5660: 20 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62   24 of the datab
5670: 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a  ase file) is .**
5680: 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d     not updated m
5690: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e  ore often than n
56a0: 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a  ecessary. .**.**
56b0: 20 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20     It is set to 
56c0: 74 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68  true when the ch
56d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
56e0: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77  ld is updated, w
56f0: 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f  hich .**   can o
5700: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e  nly happen if an
5710: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
5720: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
5730: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
5740: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
5750: 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20   (set to false) 
5760: 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c  whenever an excl
5770: 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  usive lock is .*
5780: 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64  *   relinquished
5790: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
57a0: 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65   file. Each time
57b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
57c0: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20  s committed,.** 
57d0: 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e    The changeCoun
57e0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e  tDone flag is in
57f0: 73 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69  spected. If it i
5800: 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b  s true, the work
5810: 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e   of.**   updatin
5820: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
5830: 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  nter is omitted 
5840: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5850: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
5860: 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e  **   This mechan
5870: 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ism means that w
5880: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  hen running in e
5890: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61  xclusive mode, a
58a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
58b0: 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61    need only upda
58c0: 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
58d0: 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20  unter once, for 
58e0: 74 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61  the first transa
58f0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69  ction.**   commi
5900: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d  tted..**.** setM
5910: 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68  aster.**.**   Wh
5920: 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  en PagerCommitPh
5930: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
5940: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74  ed to commit a t
5950: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
5960: 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20  ay.**   (or may 
5970: 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d  not) specify a m
5980: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
5990: 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  me to be written
59a0: 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20   into the .**   
59b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
59c0: 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64  ore it is synced
59d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
59e0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
59f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
5a00: 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65  contains a maste
5a10: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5a20: 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20  r affects .**   
5a30: 74 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68  the way in which
5a40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5a50: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61  e is finalized a
5a60: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
5a70: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f  tion is .**   co
5a80: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5a90: 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e  d back when runn
5aa0: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5ab0: 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f  mode=PERSIST" mo
5ac0: 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f  de..**   If a jo
5ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
5ae0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  not contain a ma
5af0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b00: 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20  nter, it is.**  
5b10: 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76   finalized by ov
5b20: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5b30: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
5b40: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20  er with zeroes. 
5b50: 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20  If.**   it does 
5b60: 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72  contain a master
5b70: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5b90: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a  e is finalized .
5ba0: 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69  **   by truncati
5bb0: 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  ng it to zero by
5bc0: 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20  tes, just as if 
5bd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
5be0: 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e  ere .**   runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64  de=truncate" mod
5c10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e  e..**.**   Journ
5c20: 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f  al files that co
5c30: 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75  ntain master jou
5c40: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61  rnal pointers ca
5c50: 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65  nnot be finalize
5c60: 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79  d.**   simply by
5c70: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c80: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
5c90: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5ca0: 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d  s, as the.**   m
5cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
5cc0: 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65  inter could inte
5cd0: 72 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a  rfere with hot-j
5ce0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
5cf0: 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73  of any.**   subs
5d00: 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75  equently interru
5d10: 70 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  pted transaction
5d20: 20 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65   that reuses the
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5d40: 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20  *.**   The flag 
5d50: 69 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f  is cleared as so
5d60: 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  on as the journa
5d70: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5d80: 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20  zed (either.**  
5d90: 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50   by PagerCommitP
5da0: 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72  haseTwo or Pager
5db0: 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e  Rollback). If an
5dc0: 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e   IO error preven
5dd0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72  ts the.**   jour
5de0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
5df0: 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ing successfully
5e00: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
5e10: 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a  setMaster flag.*
5e20: 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61  *   is cleared a
5e30: 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70  nyway (and the p
5e40: 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74  ager will move t
5e50: 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a  o ERROR state)..
5e60: 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c  **.** doNotSpill
5e70: 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  , doNotSyncSpill
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74  .**.**   These t
5e90: 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  wo boolean varia
5ea0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5eb0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74  */..  u8 bUseFet
7c70: 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
7c80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7c90: 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69   xFetch() */.  i
7ca0: 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20  nt nMmapOut;    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7cc0: 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67  mber of mmap pag
7cd0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  es currently out
7ce0: 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  standing */.  sq
7cf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
7d00: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73  ap;       /* Des
7d10: 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  ired maximum mma
7d20: 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64  p size */.  PgHd
7d30: 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r *pMmapFreelist
7d40: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
7d50: 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67  of free mmap pag
7d60: 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74  e headers (pDirt
7d70: 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y) */.  /*.  ** 
7d80: 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69  End of the routi
7d90: 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c  nely-changing cl
7da0: 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a  ass members.  **
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31  *********/..  u1
7e00: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7e20: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
7e30: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7e40: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
7e50: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
7e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e70: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
7e80: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
7e90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
7ea0: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
7eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7ec0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
7ed0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33  .xOpen() */.  u3
7ee0: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
7ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
7f00: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
7f10: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
7f20: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
7f30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f50: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
7f60: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
7f90: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
7fa0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34  atabase */.  i64
7fb0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
7fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
7fd0: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
7fe0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
7ff0: 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  les */.  char *z
8000: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
8010: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8020: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
8040: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
8050: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
8070: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
8080: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
8090: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
80a0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
80b0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
80c0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
80d0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
80e0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
80f0: 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74  ler */.  int aSt
8100: 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  at[3];          
8110: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61       /* Total ca
8120: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73  che hits, misses
8130: 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23   and writes */.#
8140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8150: 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  T.  int nRead;  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8180: 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  s read */.#endif
8190: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
81a0: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
81b0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
81c0: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
81d0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
81e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
81f0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
8200: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
8210: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
8220: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
8230: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8240: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8250: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8260: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8270: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8280: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8290: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
82a0: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
82b0: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
82c0: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
82d0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
82e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
82f0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
8300: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
8310: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
8320: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
8330: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8340: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8350: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8360: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8370: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8380: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8390: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
83a0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
83b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
83c0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
83d0: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
83e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
83f0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
8400: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
8410: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
8420: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
8430: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8440: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8450: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8460: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8470: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8480: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8490: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
84a0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
84b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
84c0: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
84d0: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
84e0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
84f0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8500: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8510: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8520: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8530: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8540: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8550: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8560: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8570: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68  RITE 2../*.** Th
8580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
8590: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
85a0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
85b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
85c0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
85d0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
85e0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
85f0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
8600: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
8610: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
8620: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
8630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8640: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
8650: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
8660: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8670: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8680: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
8690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86a0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
86b0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
86c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
86d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
86e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86f0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
8700: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
8710: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
8720: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
8730: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
8740: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
8750: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
8760: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
8770: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
8780: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
8790: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
87a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
87b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
87c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
87d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
87e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
87f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
8800: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
8810: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
8820: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8830: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
8840: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
8850: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8860: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
8870: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
8880: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
88a0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
88b0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
88c0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
88d0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
88e0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
88f0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
8900: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
8910: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
8920: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
8930: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
8940: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
8950: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
8960: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8970: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
8980: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
8990: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
89a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
89b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
89c0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
89d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
89e0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
89f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8a00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
8a10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
8a20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
8a30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
8a40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
8a50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8a60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
8a70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
8a80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
8a90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
8aa0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
8ab0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
8ac0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
8ad0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
8ae0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8af0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8b00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8b10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8b20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8b30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8b40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8b50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8b60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8b70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8b80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
8b90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
8ba0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
8bb0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
8bc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
8bd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
8be0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8bf0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8c00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8c10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8c20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8c30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8c40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8c50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8c60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8c70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8c80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
8c90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8ca0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
8cb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
8cc0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
8cd0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
8ce0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8cf0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8d00: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8d10: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8d20: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8d30: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8d40: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8d50: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8d60: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8d70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8d80: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
8d90: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8da0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8db0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
8dc0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
8dd0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
8de0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8df0: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8e00: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8e10: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8e30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8e40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8e50: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8e60: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8e70: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8e80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
8e90: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
8ea0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
8eb0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
8ec0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
8ed0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
8ee0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8ef0: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8f00: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8f10: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8f20: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8f30: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8f40: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8f60: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8f70: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8f80: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
8f90: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
8fa0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  f../*.** The mac
8fb0: 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74  ro USEFETCH is t
8fc0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c  rue if we are al
8fd0: 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65  lowed to use the
8fe0: 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66   xFetch and xUnf
8ff0: 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63  etch.** interfac
9000: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9010: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
9020: 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
9030: 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  O..*/.#if SQLITE
9040: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
9050: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9060: 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65  CH(x) ((x)->bUse
9070: 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64  Fetch).#else.# d
9080: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
9090: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
90a0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
90b0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
90c0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
90d0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
90e0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
90f0: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  647../*.** The a
9100: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
9110: 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20  macro is a file 
9120: 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65  descriptor (type
9130: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e   sqlite3_file*).
9140: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
9150: 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  it is not open, 
9160: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74  or non-zero (but
9170: 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73   not 1) if it is
9180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9190: 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69  so that expressi
91a0: 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74  ons can be writt
91b0: 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  en as:.**.**   i
91c0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
91d0: 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a  ->jfd) ){ ....**
91e0: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  .** instead of.*
91f0: 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65  *.**   if( pPage
9200: 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
9210: 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69   ){ ....*/.#defi
9220: 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28  ne isOpen(pFd) (
9230: 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29  (pFd)->pMethods)
9240: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9250: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
9260: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
9270: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
9280: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
9290: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
92a0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
92b0: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
92c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
92d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
92e0: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
92f0: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
9300: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
9310: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9320: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9330: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9340: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9350: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9360: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
9370: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
9380: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
9390: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
93a0: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
93b0: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
93c0: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
93d0: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
93e0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
93f0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9400: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9410: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9420: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9430: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9440: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9450: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9460: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
9470: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
9480: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
9490: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
94a0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
94b0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
94c0: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
94d0: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
94e0: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
94f0: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9500: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9510: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9520: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9530: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9540: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9550: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9560: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9570: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9580: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
9590: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
95a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
95b0: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
95c0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
95d0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
95e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
95f0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9600: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9610: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9620: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9630: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9640: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9650: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9660: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9670: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9680: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9690: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
96a0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
96b0: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
96c0: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
96d0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
96e0: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
96f0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9700: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9710: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9720: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9730: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9740: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9750: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9760: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9770: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9780: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9790: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
97a0: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
97b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
97c0: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
97d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
97e0: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
97f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9800: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9810: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9820: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9830: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9840: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9850: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9860: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9870: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9880: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9890: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
98a0: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
98b0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
98c0: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
98d0: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
98e0: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
98f0: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9900: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9910: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9930: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9940: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9950: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9960: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9970: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9980: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9990: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
99a0: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
99b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
99c0: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
99e0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
99f0: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9a00: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9a10: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9a20: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9a30: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9a40: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9a50: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9a60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9a70: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9a80: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9aa0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9ab0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ac0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ad0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
9ae0: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
9af0: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
9b00: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
9b10: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9b20: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
9b30: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
9b40: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
9b50: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
9b60: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
9b70: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
9b80: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
9b90: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
9ba0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
9bb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9bc0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
9bd0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
9be0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9bf0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9c00: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
9c10: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
9c20: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
9c30: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
9c40: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
9c50: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
9c60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c70: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9c80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9c90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ca0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
9cb0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
9cc0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
9cd0: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
9ce0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9cf0: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
9d00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9d10: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9d20: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d40: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d60: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
9d70: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
9d80: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9d90: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9da0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9db0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9dc0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9de0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9df0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e00: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9e10: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9e20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9e30: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9e40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
9e50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e60: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
9e70: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9e80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9e90: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9ea0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
9eb0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
9ec0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ed0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9ee0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
9ef0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9f10: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
9f20: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
9f40: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
9fd0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
9fe0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
9ff0: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a000: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a020: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a030: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a040: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a050: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a060: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a070: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a080: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a090: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a0a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a0b0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a0d0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a0e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a0f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a100: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a110: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a120: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a130: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a150: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a160: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a170: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a190: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a1a0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a1b0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a1c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1d0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a1e0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a1f0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a200: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a210: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a220: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a230: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a240: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a250: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a260: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a270: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a280: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a290: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2b0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a2c0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a2d0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a2e0: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a320: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a330: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a340: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a350: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a360: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a370: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a380: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a390: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a3a0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a3b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a3c0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a3d0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a3e0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a3f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a400: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a410: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a420: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a430: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a450: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a460: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a470: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a480: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a490: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a4a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a4b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a4c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a4d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a4e0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a4f0: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a500: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a510: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a520: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a530: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a540: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a550: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a560: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a570: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a580: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a590: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a5a0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5c0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a5d0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a5e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a5f0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a600: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a620: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a630: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a640: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a650: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a660: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a670: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a680: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a690: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a6a0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a6b0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a6c0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a6d0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a6e0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a6f0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a700: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a710: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a720: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a730: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a740: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a750: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a760: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a770: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a780: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a790: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a7a0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a7b0: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a7c0: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
a7d0: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
a7e0: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
a7f0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
a800: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
a810: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
a820: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
a830: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
a840: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
a850: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
a860: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
a870: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a880: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
a890: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
a8a0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
a8b0: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
a8c0: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
a8d0: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
a8e0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
a8f0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
a900: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
a910: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
a920: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
a930: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
a940: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
a950: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
a960: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
a970: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
a980: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
a990: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
a9a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a9b0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
a9c0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
a9d0: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
a9e0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a9f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
aa00: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
aa10: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
aa30: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
aa40: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
aa50: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
aa60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aa70: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
aa80: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
aa90: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
aaa0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
aab0: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
aac0: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
aad0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aae0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
aaf0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ab00: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ab10: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ab20: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ab30: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
ab40: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ab50: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ab60: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ab70: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ab80: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ab90: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
aba0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
abb0: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
abc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
abd0: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
abe0: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
abf0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
ac00: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
ac10: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
ac20: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
ac30: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
ac40: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
ac50: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
ac60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
ac80: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
ac90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aca0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
acb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
acc0: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
acd0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ace0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
acf0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
ad00: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
ad10: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ad20: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ad30: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ad40: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
ad50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ad60: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ad70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
ad80: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
ad90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
ada0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
adb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
adc0: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
add0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ade0: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
adf0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
ae00: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
ae10: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
ae20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
ae30: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
ae40: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
ae50: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
ae60: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
ae70: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
ae80: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
ae90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
aea0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
aeb0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
aec0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
aed0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
aee0: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
aef0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
af00: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
af10: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
af20: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
af30: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
af40: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
af50: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
af60: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
af70: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
af80: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
af90: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
afa0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
afb0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
afc0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
afd0: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
afe0: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
aff0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b010: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b020: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b030: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b040: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
b050: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
b060: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
b070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b080: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b090: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
b0a0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
b0b0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b0c0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b0d0: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b0e0: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b0f0: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b100: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b120: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b130: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
b140: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b150: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b160: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b170: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b180: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b190: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
b1a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b1b0: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
b1c0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b1d0: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b1e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b1f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b200: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b210: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b220: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b230: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b240: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b250: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b260: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b270: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b280: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b290: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b2a0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b2b0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b2c0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b2d0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b2e0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b2f0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b300: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b310: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b320: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b330: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b340: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b350: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b360: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b370: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b380: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b390: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b3b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b3c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b3d0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b3e0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b3f0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b400: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b410: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b420: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b430: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b440: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b450: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b460: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b470: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b480: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b490: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b4a0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b4b0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b4d0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b4e0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b4f0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b500: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b510: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b520: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b530: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b540: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b550: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b560: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b570: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b580: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b590: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b5a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b5b0: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b5c0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b5d0: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b5e0: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b5f0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b600: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b610: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b620: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b630: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b640: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b650: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b660: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b670: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b680: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b690: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b6a0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b6b0: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b6c0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b6d0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b6e0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b6f0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b700: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b710: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b720: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b730: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b740: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b750: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b760: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b770: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b780: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b790: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b7b0: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b7c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b7d0: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b7e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b7f0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b800: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b810: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b820: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
b830: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
b840: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
b850: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
b860: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b870: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
b880: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
b890: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b8a0: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
b8b0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
b8c0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
b8d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
b8e0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b8f0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b900: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b910: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
b920: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
b930: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
b940: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
b950: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
b960: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
b970: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
b980: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
b990: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
b9a0: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
b9b0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b9c0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b9d0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b9e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
b9f0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
ba00: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
ba10: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
ba20: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
ba30: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
ba40: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
ba50: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
ba60: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
ba70: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
ba80: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
ba90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
baa0: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
bab0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bac0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
bad0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bae0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
baf0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bb00: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
bb10: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
bb20: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
bb30: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
bb40: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
bb50: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
bb60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
bb70: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bb80: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bb90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bba0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bbb0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bbc0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bbd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bbe0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bbf0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bc00: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
bc10: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bc20: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bc30: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bc50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bc60: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bc70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bc80: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bc90: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bca0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bcb0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bcc0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bcd0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bce0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bcf0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bd00: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bd10: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bd20: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bd30: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bd40: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bd50: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bd60: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bd70: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bd80: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bd90: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bda0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bdb0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bdc0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bdd0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bde0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bdf0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
be00: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
be10: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
be20: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
be30: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
be40: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
be50: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
be60: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
be70: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
be80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
be90: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
bea0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
beb0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
bec0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
bed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
bee0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
bef0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
bf00: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
bf10: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
bf20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
bf30: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
bf40: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
bf50: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
bf60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
bf70: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
bf80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
bf90: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
bfc0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
bfd0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
bfe0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c000: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c010: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c040: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c050: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c060: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c070: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c080: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c090: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c0a0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c0b0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c0c0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c0d0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c0e0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c0f0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c100: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c110: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c120: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c130: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c140: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c150: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c160: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c170: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c180: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c1a0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c1b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c1c0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c1d0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c1e0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c1f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c200: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c210: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c220: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c230: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c240: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c250: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c260: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c270: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c280: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c290: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c2a0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c2b0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c2c0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c2d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c2e0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c2f0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c300: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c310: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c320: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c330: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c340: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c350: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c360: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c370: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c390: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c3a0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c3b0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c3c0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c3d0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c3e0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c3f0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c400: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c410: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c420: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c430: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c440: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c460: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c470: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c480: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c490: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c4a0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c4b0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c4c0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c4d0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c4e0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c4f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c500: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c510: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c520: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c530: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c540: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c550: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c560: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c570: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c580: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c590: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c5a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c5b0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c5c0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c5d0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c5e0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c5f0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c600: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c610: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c620: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c630: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c640: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c650: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c660: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c670: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c680: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c690: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c6a0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c6b0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c6c0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c6e0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c6f0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c700: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c710: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c720: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c730: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c740: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c750: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c760: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c770: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c780: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c790: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c7a0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c7b0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c7c0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c7d0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c7e0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c7f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c800: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
c810: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
c820: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
c830: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
c840: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
c850: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
c860: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
c870: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
c880: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
c890: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
c8a0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
c8b0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
c8c0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
c8d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c8e0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
c8f0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
c900: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
c910: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
c920: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
c930: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
c940: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
c950: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
c960: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
c970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c980: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
c990: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
c9a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
c9b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c9c0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c9d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c9e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
c9f0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
ca00: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ca10: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ca20: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ca30: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
ca40: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ca50: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
ca60: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
ca70: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
ca80: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
ca90: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
caa0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cab0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cac0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cad0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cae0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
caf0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cb00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cb10: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cb20: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cb30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cb40: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cb50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cb60: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cb70: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cb80: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cb90: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cba0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cbb0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cbc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cbd0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cbe0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cbf0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cc00: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cc10: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cc20: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc30: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc50: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cc60: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cc70: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cc80: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cca0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
ccb0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ccc0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
ccf0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cd00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cd10: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cd20: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cd30: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cd40: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cd50: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cd60: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cd70: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cd80: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cd90: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cda0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cdb0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cdc0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cdd0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cde0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cdf0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ce00: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
ce10: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
ce20: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
ce30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
ce40: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
ce50: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
ce60: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
ce70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
ce80: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
ce90: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cea0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
ceb0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
cec0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
ced0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
cee0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
cef0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
cf00: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
cf10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cf20: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
cf30: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
cf40: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
cf50: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
cf60: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
cf70: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
cf80: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
cf90: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
cfa0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
cfb0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
cfc0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
cfd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
cfe0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
cff0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d000: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d010: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d020: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d030: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d040: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d050: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d060: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d070: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d080: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d090: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d0a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d0c0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d0d0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d0e0: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d0f0: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d100: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d110: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d120: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d130: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d140: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d150: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d160: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d170: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d180: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d190: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d1a0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d200: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d210: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d220: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d230: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d240: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d260: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d270: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d280: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d290: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d2a0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d2b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d2c0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d2d0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d2e0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d2f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d300: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d310: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d320: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d340: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d350: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d360: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d370: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d380: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d3a0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d3b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d3c0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d3d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d3e0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d400: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d420: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d430: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d440: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d450: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d460: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d470: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d480: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d490: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d4a0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d4b0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d4c0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
d4d0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
d4e0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
d4f0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
d500: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
d510: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
d520: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
d530: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
d540: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
d550: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
d560: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
d570: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
d580: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
d590: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
d5a0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
d5b0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
d5c0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
d5d0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
d5e0: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
d5f0: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
d600: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
d610: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
d620: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
d630: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
d640: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
d650: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
d660: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
d670: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
d680: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
d690: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d6a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d6b0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
d6c0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
d6d0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
d6e0: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
d6f0: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
d700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d710: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
d720: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d730: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
d740: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
d750: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
d760: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
d770: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
d780: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
d790: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
d7a0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
d7b0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
d7c0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
d7d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d800: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
d810: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
d820: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
d830: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
d840: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
d850: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
d860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
d870: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
d880: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
d890: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
d8a0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
d8b0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
d8c0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
d8d0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
d910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d920: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d930: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
d940: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
d950: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d960: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
d970: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
d980: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
d990: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d9a0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
d9b0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
d9c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d9d0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
d9e0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
d9f0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
da00: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
da10: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
da20: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
da30: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
da40: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
da50: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
da60: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
da70: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
da80: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
da90: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
daa0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dab0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
dac0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
dad0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
dae0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
daf0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
db00: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
db10: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
db20: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
db30: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
db40: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
db50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
db60: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
db70: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
db80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
db90: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
dba0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
dbb0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
dbc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
dbd0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
dbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dbf0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
dc00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc10: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dc20: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dc30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dc50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dc60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dc70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
dc80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dc90: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
dca0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
dcb0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
dcc0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
dcd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dce0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
dcf0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
dd00: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
dd10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
dd20: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
dd30: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
dd40: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
dd50: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
dd60: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
dd70: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
dd80: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
dd90: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
dda0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
ddb0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
ddc0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
ddd0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
dde0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
ddf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
de00: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
de10: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
de20: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
de30: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
de40: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
de50: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
de60: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
de70: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
de80: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
de90: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
dea0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
deb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
dec0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
ded0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
dee0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
def0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df00: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
df10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
df20: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
df30: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
df40: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
df50: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
df60: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
df70: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
df80: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
df90: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
dfa0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
dfb0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
dfc0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
dfe0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
dff0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e000: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e030: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e040: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e050: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e060: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e070: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e080: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e090: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e0a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e0b0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e0c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e0e0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e0f0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e100: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e110: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e120: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e130: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e140: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e150: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e160: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e170: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e180: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e190: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e1a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e1b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e1c0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e1d0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e1e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e1f0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e200: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e210: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e220: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e230: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e240: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e250: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e260: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e270: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e280: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e290: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e2a0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e2b0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e2c0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e2d0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e2e0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e2f0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e300: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e310: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e320: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e330: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e340: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e350: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e360: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e370: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e380: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e390: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e3a0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e3b0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e3c0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e3d0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e3e0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e3f0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e400: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e410: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e430: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e440: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e450: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e460: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e470: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e480: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e490: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e4a0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e4b0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e4c0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e4d0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e4f0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e500: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e510: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e520: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e530: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e540: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e550: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e560: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e570: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e580: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e590: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e5a0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e5b0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e5c0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e5d0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e5e0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e5f0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e600: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e610: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e620: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e630: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e640: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e650: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e660: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e670: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
e680: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
e690: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
e6a0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
e6b0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
e6c0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
e6d0: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
e6e0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
e6f0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
e700: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
e710: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e720: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
e730: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
e740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
e750: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e760: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
e770: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e780: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e790: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
e7a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
e7b0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
e7c0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e7d0: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
e7e0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
e7f0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
e800: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
e810: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
e820: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
e830: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
e840: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e850: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e860: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e870: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
e880: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e890: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
e8a0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
e8b0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
e8c0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e8d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e8e0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
e8f0: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
e900: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
e910: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
e920: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
e930: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e940: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e950: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
e960: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
e970: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
e980: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
e990: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e9a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e9b0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
e9c0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
e9d0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
e9e0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
e9f0: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ea00: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ea10: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ea20: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ea30: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ea40: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ea50: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ea60: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
ea70: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ea80: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ea90: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
eaa0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
eab0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eac0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ead0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eaf0: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
eb00: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
eb10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eb20: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eb30: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eb40: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eb50: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eb60: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eb70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
eb80: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
eb90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
eba0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ebb0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ebc0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ebd0: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ebe0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ebf0: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ec00: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ec10: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
ec20: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
ec30: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
ec40: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
ec50: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
ec60: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
ec70: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
ec80: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
ec90: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
eca0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
ecb0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
ecc0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
ecd0: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
ece0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
ecf0: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
ed00: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
ed10: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
ed20: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
ed30: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
ed40: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
ed50: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
ed60: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
ed70: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
ed80: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
ed90: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
eda0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
edb0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
edc0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
edd0: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
ede0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
edf0: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
ee00: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
ee10: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
ee20: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
ee30: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
ee40: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
ee50: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
ee60: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ee70: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
ee80: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
ee90: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
eea0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
eeb0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
eec0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
eed0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
eee0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
eef0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ef00: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
ef10: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
ef20: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
ef30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
ef40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ef50: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
ef60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
ef70: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
ef80: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
ef90: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
efa0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
efb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
efc0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
efd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
efe0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
eff0: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f000: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f010: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f020: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f030: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f040: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f050: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f060: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f070: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f080: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f090: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f0a0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f0b0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f0c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f0d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f0e0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f0f0: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f100: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f110: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f120: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f130: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f140: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f150: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f160: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f170: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f180: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f190: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f1a0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f1b0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f1c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f1d0: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f1e0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f1f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f200: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f210: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f220: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f230: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f240: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f250: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f260: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f270: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f280: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f290: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f2a0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f2c0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f2d0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f2e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f2f0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f300: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f310: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f320: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f330: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f340: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f350: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f360: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f370: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f380: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f390: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f3a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f3c0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f3d0: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f3e0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f400: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f410: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f420: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f430: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f440: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f450: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f460: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f470: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f490: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f4a0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f4b0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f4c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f4f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f500: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f510: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f520: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f530: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f540: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f560: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f570: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f580: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f590: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f5a0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f5b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f5c0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f5d0: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f5e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f5f0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f600: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f610: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f620: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f630: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f640: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f650: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f660: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f670: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
f680: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f690: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
f6a0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
f6b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f6c0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
f6d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
f6e0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
f6f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f700: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
f710: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
f720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
f730: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
f740: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
f750: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f760: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
f770: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
f780: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
f790: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
f7a0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
f7b0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
f7c0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
f7d0: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
f7e0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
f7f0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f800: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
f810: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
f820: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
f830: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
f840: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
f850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f860: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
f870: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
f880: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
f890: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f8c0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
f8d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f8e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
f8f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f900: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f910: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
f920: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
f930: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
f940: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f950: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
f960: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
f970: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
f980: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
f990: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
f9a0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
f9b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f9c0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
f9d0: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
f9e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
f9f0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fa00: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fa10: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fa20: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fa30: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fa40: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fa50: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fa60: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fa70: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fa80: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fa90: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
faa0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fab0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fac0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fad0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fae0: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
faf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fb00: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fb10: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fb20: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
fb30: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fb40: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fb50: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb70: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
fb80: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
fb90: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
fba0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
fbb0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fbc0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fbd0: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
fbe0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
fbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc10: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
fc20: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
fc30: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fc40: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fc50: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fc60: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fc70: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
fc80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fc90: 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
fca0: 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
fcb0: 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
fcc0: 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
fcd0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
fce0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
fcf0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
fd00: 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
fd10: 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
fd20: 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
fd30: 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
fd40: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
fd50: 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
fd60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
fd70: 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
fd80: 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
fd90: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fda0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fdb0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
fdc0: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
fdd0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
fde0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
fdf0: 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
fe00: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
fe10: 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
fe20: 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
fe30: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
fe40: 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
fe50: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
fe60: 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
fe70: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
fe80: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
fe90: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
fea0: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
feb0: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
fec0: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fed0: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
fee0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
fef0: 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
ff00: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
ff10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ff20: 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
ff30: 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
ff40: 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
ff50: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
ff60: 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
ff70: 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
ff80: 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
ff90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
ffa0: 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
ffb0: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
ffc0: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
ffd0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
ffe0: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
fff0: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10000 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10010 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10020 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10030 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10040 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10050 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10060 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
10070 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10090 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
100a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
100b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
100c0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
100d0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
100e0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
100f0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10100 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10110 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10120 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10130 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10140 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10150 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10160 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
10170 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10180 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10190 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
101a0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
101b0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
101c0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
101d0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
101e0 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
101f0 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10200 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10210 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10220 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10230 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10240 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10250 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10260 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10270 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10280 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10290 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
102a0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
102b0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
102c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
102d0 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
102e0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
102f0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10300 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10310 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10320 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10330 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10340 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10350 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
10370 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10380 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10390 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
103a0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
103b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103c0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
103d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
103e0 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
103f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10400 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10410 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10420 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10430 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10440 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10450 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10460 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
10470 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10490 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
104a0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
104b0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
104c0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
104d0 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
104e0 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
104f0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10500 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10510 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10530 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10540 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10550 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10560 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10570 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10580 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10590 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
105a0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
105b0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
105c0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
105d0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
105e0 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
105f0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10600 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10610 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10620 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10630 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10640 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10650 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10660 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10670 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10680 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10690 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
106a0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
106b0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
106c0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
106d0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
106e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
106f0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10710 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10720 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10750 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10760 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10780 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10790 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
107a0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
107d0 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
107e0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
107f0 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10810 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10820 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10830 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10860 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10870 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10880 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
108a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
108b0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
108c0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
108d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
108e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
108f0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10900 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
10910 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
10920 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
10930 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
10950 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
10960 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
10970 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
10980 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
10990 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
109a0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
109b0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
109c0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
109d0 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
109e0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
109f0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10a00 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10a10 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10a20 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10a30 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10a40 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10a50 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10a60 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10a70 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10a80 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10a90 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10aa0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10ab0 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10ac0 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10ad0 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ae0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10af0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10b00 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10b20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10b30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10b40 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10b50 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10b60 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10b70 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10b80 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10b90 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10ba0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10bb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10bc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10bd0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10be0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10bf0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10c00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10c10 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10c20 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10c30 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10c40 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10c50 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10c60 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10c70 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10c80 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10c90 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10ca0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10cb0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10cc0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10cd0 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ce0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10cf0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10d00 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10d10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10d20 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10d30 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10d40 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10d50 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10d60 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10d70 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10d80 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10d90 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10da0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10db0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10dc0 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10dd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10de0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10df0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10e00 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10e10 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10e20 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10e30 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
10e40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10e50 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
10e60 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
10e70 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
10e80 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
10e90 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
10ea0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
10eb0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
10ec0 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
10ed0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
10ee0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
10ef0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
10f00 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
10f10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
10f20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10f30 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
10f40 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
10f50 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
10f60 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
10f70 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
10f80 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
10f90 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
10fa0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
10fb0 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
10fc0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
10fd0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10fe0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
10ff0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
11000 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
11010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
11020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11030 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11040 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11050 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11060 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11070 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
11080 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
11090 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
110a0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
110b0 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
110c0 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
110d0 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
110e0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
110f0 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
11100 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
11110 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
11120 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
11130 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11140 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11170 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
11180 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
11190 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
111a0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
111b0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
111c0 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
111d0 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
111e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
111f0 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
11200 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
11210 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
11220 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
11230 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11240 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
11250 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
11260 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
11270 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11280 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
11290 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
112a0 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
112b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
112c0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
112d0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
112e0 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
112f0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11320 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11330 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11340 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11350 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11360 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11370 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
11380 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11390 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
113a0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
113b0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
113c0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
113d0 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
113e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
113f0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11400 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11410 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11420 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11430 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11440 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11450 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11460 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11470 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11480 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11490 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
114a0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
114b0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
114c0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
114d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
114e0 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
114f0 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11500 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11510 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11520 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11540 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11550 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11560 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11570 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11580 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11590 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
115a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
115b0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
115c0 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
115d0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
115e0 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
115f0 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11600 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11610 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11620 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11630 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11640 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11650 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11660 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11670 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
11680 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11690 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
116a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
116b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
116c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
116d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
116e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
116f0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11700 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11710 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11720 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11730 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11740 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11750 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11760 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11770 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
11780 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11790 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
117a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
117b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
117c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
117d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
117e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
117f0 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11810 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11820 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
11830 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11840 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11850 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
11860 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
11870 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
11880 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11890 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
118a0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
118b0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
118c0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
118d0 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
118e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
118f0 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11900 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11910 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11920 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11930 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11940 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11950 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11960 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11970 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11980 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11990 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
119a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
119b0 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
119c0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
119d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
119e0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
119f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11a00 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11a10 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11a20 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11a30 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11a40 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11a50 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11a60 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11a70 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11a80 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11a90 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11aa0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11ab0 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11ac0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11ad0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11ae0 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11af0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11b00 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11b10 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11b20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11b30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11b40 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11b50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11b60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11b70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11b80 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11b90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11ba0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11bb0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11bc0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11bd0 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11be0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11bf0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11c00 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11c10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11c20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11c30 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11c40 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11c50 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11c60 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11c70 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11c80 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11c90 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11ca0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11cb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11cc0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11cd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11ce0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11cf0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11d00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11d20 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11d30 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11d40 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11d50 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11d60 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11d70 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11d80 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11d90 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11da0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11db0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11dc0 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11dd0 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11de0 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11df0 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11e00 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11e10 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11e20 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11e30 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11e40 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11e50 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11e60 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11e70 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11e80 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
11e90 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11ea0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11eb0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
11ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11ed0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11ee0 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
11ef0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11f00 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11f10 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
11f20 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11f30 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11f40 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
11f50 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
11f60 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11f70 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
11f80 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
11f90 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11fa0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
11fb0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
11fc0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
11fd0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
11fe0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11ff0 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12000 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12010 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12030 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12040 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12050 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12060 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12070 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12080 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12090 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
120a0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
120b0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
120c0 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
120d0 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
120e0 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
120f0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12100 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12110 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12120 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
12130 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12150 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12160 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12170 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12180 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12190 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
121a0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
121b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
121c0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
121d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
121e0 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
121f0 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12200 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12210 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12220 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12230 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12240 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12250 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12260 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12270 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12280 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12290 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
122a0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
122b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
122c0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
122d0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
122e0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
122f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12300 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12310 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12320 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12330 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12340 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12350 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12360 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12370 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12380 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12390 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
123a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
123b0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
123c0 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
123d0 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
123e0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
123f0 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12400 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12410 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12420 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12440 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12450 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
12460 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
12470 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12480 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12490 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
124a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
124b0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
124c0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
124d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
124e0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
124f0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12500 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12510 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12520 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12530 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12540 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12560 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12570 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
12580 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
12590 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125a0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125b0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125c0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125d0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
125e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
125f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12600 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12610 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12620 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12630 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12640 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12650 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12660 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12670 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
12680 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12690 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126a0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126c0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126d0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
126e0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
126f0 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12700 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12710 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12720 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12730 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12740 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12750 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12760 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12770 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12780 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
12790 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127a0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127b0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127c0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127d0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
127e0 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
127f0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12800 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12810 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12820 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12830 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12840 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12850 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12860 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12870 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
12880 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
12890 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128a0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128b0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128c0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
128e0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
128f0 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12900 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12910 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12920 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12930 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12940 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12950 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12960 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12970 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
12980 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
12990 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129b0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129d0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
129e0 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
129f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a10 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a20 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a30 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a40 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a50 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a60 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12a80 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12a90 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12aa0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ac0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12ad0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12ae0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12af0 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b00 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b10 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b30 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b40 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b50 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b60 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b70 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12b80 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12b90 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12ba0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12bc0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bd0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12be0 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12bf0 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c00 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c20 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c40 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c50 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c60 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c70 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12c80 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12c90 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12ca0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cb0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12cc0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cd0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12ce0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12cf0 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d00 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d10 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d40 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d50 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d60 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d70 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12d80 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12d90 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12db0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12dc0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12dd0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12de0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12df0 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e10 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e20 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e30 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e40 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e60 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e70 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e80 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12e90 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ea0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12eb0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ec0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ed0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12ee0 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12ef0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f00 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f10 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f20 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f30 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f40 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f50 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f60 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f70 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12f80 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12f90 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fa0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fb0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fc0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12fe0 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
12ff0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13000 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13010 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13020 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13030 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13040 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13050 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13070 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
13080 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
13090 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130a0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130c0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130d0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
130e0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
130f0 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13100 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13110 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13120 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13130 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13150 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13160 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13170 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
13180 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
13190 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131b0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131c0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131d0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
131e0 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
131f0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13200 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13210 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13220 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13230 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13240 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13250 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13260 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13270 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
13280 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
13290 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132a0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132d0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
132e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
132f0 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13300 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13310 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13330 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13340 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13350 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13360 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13370 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
13380 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
13390 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133a0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133b0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133c0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133d0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
133e0 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
133f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13400 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13410 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13420 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13430 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13440 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13450 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13460 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13470 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
13480 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
13490 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134c0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134d0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
134e0 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
134f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13500 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13510 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13520 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13530 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13540 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13550 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13560 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13570 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
13580 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
13590 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135a0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135b0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135d0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
135e0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
135f0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13600 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13610 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13620 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13630 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13640 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13650 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13660 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13670 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
13680 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
13690 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136a0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136c0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136d0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
136e0 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
136f0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13700 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13710 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13720 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13730 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13740 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13750 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13760 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13770 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
13780 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
13790 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137a0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137b0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137d0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
137e0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
137f0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13800 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13810 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13820 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13830 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13840 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13850 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13870 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13880 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
13890 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138a0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138b0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138c0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
138e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
138f0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13900 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13910 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13920 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13930 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13940 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13950 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13960 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13970 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13980 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
13990 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139c0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
139e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
139f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a00 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a10 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a30 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a60 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a70 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13a80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13a90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13ae0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13af0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b00 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13b10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13b20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13b30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b40 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b50 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13b60 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13b70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b90 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13ba0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13bc0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13bd0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13be0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13bf0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c10 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13c20 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13c30 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13c40 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13c50 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13c60 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13c70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13c80 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13c90 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13ca0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13cb0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13cc0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13cd0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13ce0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13cf0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13d00 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13d10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13d20 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13d30 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13d40 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13d50 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13d60 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13d70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13d80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13d90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13da0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13db0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13dc0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13dd0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13df0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13e00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e10 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13e30 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13e40 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13e50 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13e60 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
13e70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13e80 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13e90 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13ea0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13eb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13ec0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13ed0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13ee0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13ef0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13f00 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13f10 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13f20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13f30 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13f40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13f50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13f60 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13f70 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13f80 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13f90 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13fa0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13fb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13fc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13fe0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13ff0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
14000 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
14010 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
14020 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
14030 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
14040 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
14050 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
14060 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
14070 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
14080 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14090 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
140a0 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
140b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
140c0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
140d0 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
140e0 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
140f0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14100 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
14110 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14120 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
14130 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
14140 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
14150 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
14160 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
14170 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
14180 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14190 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
141a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
141b0 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
141c0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
141d0 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
141e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
141f0 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14200 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
14210 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
14220 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
14230 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14240 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
14250 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
14260 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
14270 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
14280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14290 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
142a0 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
142b0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
142c0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
142d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
142e0 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
142f0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
14300 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
14310 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
14320 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
14330 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
14340 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
14350 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
14360 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
14370 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
14380 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
14390 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
143a0 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
143b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
143c0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
143d0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
143e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
143f0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
14400 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
14410 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
14420 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14430 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
14440 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
14450 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
14460 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
14470 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
14480 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
14490 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
144a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
144b0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
144c0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
144d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
144e0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
144f0 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
14500 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
14510 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
14520 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
14530 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
14540 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
14550 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14560 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
14570 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
14580 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
14590 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
145a0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
145b0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
145c0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
145d0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
145e0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
145f0 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
14600 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
14610 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
14620 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14630 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
14640 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
14650 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
14660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
14670 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
14680 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
14690 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
146a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
146b0 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
146c0 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
146d0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
146e0 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
146f0 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
14700 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
14710 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
14720 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
14730 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
14740 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
14750 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
14760 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
14770 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
14780 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
14790 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
147a0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
147b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
147c0 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
147d0 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
147e0 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
147f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
14800 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
14810 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
14820 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14830 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
14840 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
14850 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
14860 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
14870 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14890 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
148a0 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
148b0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
148c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
148d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
148e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
148f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14900 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
14910 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
14920 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
14930 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14940 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14950 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14970 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14980 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14990 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
149a0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
149b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
149c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
149d0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
149e0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
149f0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  tion(pPager, 0, 
14a00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
14a10 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
14a20 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ger);.}../*.** P
14a30 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
14a40 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
14a50 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
14a60 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
14a70 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
14a80 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
14a90 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
14aa0 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
14ab0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
14ac0 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
14ad0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14ae0 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
14af0 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
14b00 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
14b10 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
14b20 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
14b30 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
14b40 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
14b50 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
14b60 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
14b70 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
14b80 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
14b90 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
14ba0 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
14bb0 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
14bc0 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
14bd0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14be0 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
14bf0 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
14c00 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
14c10 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
14c20 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
14c30 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
14c40 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
14c50 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
14c60 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
14c70 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
14c80 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
14c90 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
14ca0 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
14cb0 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
14cc0 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
14cd0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
14ce0 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
14cf0 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
14d00 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
14d10 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
14d20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
14d30 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
14d40 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
14d50 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
14d60 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
14d70 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
14d80 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
14d90 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
14da0 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
14db0 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
14dc0 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
14dd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
14de0 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
14df0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
14e00 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
14e10 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
14e20 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
14e30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
14e40 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
14e50 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
14e60 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
14e70 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
14e80 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14e90 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
14ea0 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
14eb0 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
14ec0 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
14ed0 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
14ee0 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
14ef0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
14f00 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
14f10 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
14f20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
14f30 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
14f40 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14f60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
14f70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14f80 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
14f90 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
14fa0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14fb0 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
14fc0 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
14fd0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
15000 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
15010 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
15020 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
15030 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
15040 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
15050 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
15060 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
15070 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
15080 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
15090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
150a0 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
150b0 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
150c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
150d0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
150e0 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
150f0 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
15100 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
15110 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
15120 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
15130 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
15140 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
15150 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
15160 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
15170 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
15180 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
15190 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
151a0 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
151b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
151c0 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
151d0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
151e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
151f0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15200 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15210 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15220 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
15230 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15240 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
15250 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
15260 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
15270 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
15280 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
15290 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
152a0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
152b0 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
152c0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
152d0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
152e0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
152f0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
15300 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
15310 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
15320 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
15330 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
15340 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
15350 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
15360 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
15370 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
15380 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
15390 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
153a0 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
153b0 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
153c0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
153d0 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
153e0 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
153f0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15410 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
15420 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
15430 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15440 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15450 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
15460 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
15470 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15480 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
15490 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
154a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
154b0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
154c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
154d0 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
154e0 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
154f0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
15500 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15510 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
15520 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
15530 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
15540 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
15550 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
15560 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
15570 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
15580 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
15590 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
155a0 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
155b0 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
155c0 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
155d0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
155e0 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
155f0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
15600 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
15610 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
15620 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
15630 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
15640 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
15650 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
15660 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
15670 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
15680 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
15690 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
156a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
156b0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
156c0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
156d0 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
156e0 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
156f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
15700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
15710 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
15720 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
15730 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
15740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
15750 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
15760 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
15770 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
15780 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
157b0 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
157c0 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
157d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
157e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
157f0 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
15800 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
15810 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
15820 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
15830 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
15840 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15850 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15870 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
15880 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
15890 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
158a0 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
158b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
158c0 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
158d0 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
158e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
158f0 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
15900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
15910 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
15920 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
15930 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15950 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
15960 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
15970 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
15980 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
15990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
159a0 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
159b0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
159c0 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
159f0 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
15a00 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
15a10 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
15a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
15a30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
15a40 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
15a50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
15a60 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
15a70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15a80 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
15a90 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
15aa0 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
15ab0 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
15ac0 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
15ad0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15ae0 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
15af0 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
15b00 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
15b10 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
15b20 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
15b30 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
15b40 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
15b50 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
15b60 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
15b70 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
15b80 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
15b90 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
15ba0 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
15bb0 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
15bc0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15bd0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
15be0 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
15bf0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
15c00 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
15c10 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
15c20 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
15c30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
15c40 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
15c50 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
15c60 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
15c70 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
15c80 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
15c90 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15ca0 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
15cb0 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
15cc0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
15cd0 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
15ce0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
15cf0 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
15d00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
15d10 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
15d20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15d30 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
15d40 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
15d50 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
15d60 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
15d70 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
15d80 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
15d90 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
15da0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
15db0 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
15dc0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
15dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15de0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15df0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
15e00 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
15e10 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
15e20 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
15e30 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15e40 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
15e50 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15e60 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15e70 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
15e80 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
15e90 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
15ea0 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
15eb0 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
15ec0 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
15ed0 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
15ee0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15ef0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
15f00 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
15f10 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
15f20 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
15f30 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
15f40 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
15f50 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
15f60 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
15f70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
15f80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15f90 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
15fa0 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
15fb0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
15fc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
15fd0 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
15fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15ff0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16000 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
16010 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
16020 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
16030 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
16040 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
16050 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
16060 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
16070 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
16080 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
16090 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
160a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
160b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
160c0 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
160d0 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
160e0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
160f0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
16100 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
16110 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
16120 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
16130 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
16140 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
16150 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
16160 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
16170 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
16180 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
16190 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
161a0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
161b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
161c0 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
161d0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
161e0 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
161f0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
16200 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
16210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16220 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
16230 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
16240 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
16250 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
16260 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
16270 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16280 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
16290 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
162a0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
162b0 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
162c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
162d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
162e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
162f0 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
16300 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
16310 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72  ed by before dur
16320 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
16330 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
16340 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
16350 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
16360 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
16370 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
16380 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
16390 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
163a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
163b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
163c0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
163d0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
163e0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
163f0 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
16400 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
16410 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
16420 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
16430 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
16440 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
16450 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
16460 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
16470 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
16480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16490 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
164a0 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
164b0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
164c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
164d0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
164e0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
164f0 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
16500 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
16510 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
16520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16530 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
16540 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
16550 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
16560 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
16570 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
16580 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
16590 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
165a0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
165b0 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
165c0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
165d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
165e0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
165f0 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
16600 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
16610 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
16620 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
16630 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
16640 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
16650 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
16660 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16670 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16680 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16690 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
166a0 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
166b0 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
166c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
166d0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
166e0 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
166f0 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16700 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
16710 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
16720 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
16730 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
16740 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
16750 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
16760 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16770 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16780 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16790 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
167a0 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
167b0 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
167c0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
167d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
167e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
167f0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16800 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
16810 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16820 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
16830 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
16840 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
16850 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
16860 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16870 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16880 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16890 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
168a0 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
168b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
168c0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
168d0 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
168e0 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
168f0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16900 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
16910 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
16920 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
16930 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
16940 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
16950 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
16960 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16970 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16980 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16990 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
169a0 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
169b0 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
169c0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
169d0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
169e0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
169f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16a00 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
16a10 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
16a20 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
16a30 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
16a40 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
16a50 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
16a60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16a70 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16a80 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16a90 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16aa0 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16ab0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16ac0 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16ad0 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16af0 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16b00 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
16b10 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
16b20 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
16b30 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16b40 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
16b50 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
16b60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16b70 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16b80 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16b90 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16ba0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16bb0 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16bc0 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16bd0 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16be0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
16bf0 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
16c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16c10 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
16c20 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
16c30 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
16c40 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
16c50 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
16c60 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
16c70 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
16c80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
16c90 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
16ca0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16cb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16cc0 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
16cd0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16ce0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
16cf0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
16d00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16d10 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
16d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16d30 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
16d40 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20  _OPEN || pPg==0 
16d50 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
16d60 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
16d70 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16d80 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
16d90 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
16da0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
16db0 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
16dc0 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
16dd0 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
16de0 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
16df0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
16e00 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
16e10 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
16e20 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
16e30 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
16e40 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
16e50 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
16e60 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
16e70 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
16e80 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
16e90 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
16ea0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
16eb0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
16ec0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
16ed0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
16ee0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16ef0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
16f00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
16f10 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
16f20 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
16f30 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
16f40 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16f50 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
16f60 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
16f70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
16f80 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
16f90 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
16fa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
16fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16fc0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
16fd0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
16fe0 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
16ff0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
17000 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
17010 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
17020 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17030 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17040 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
17050 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
17060 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
17070 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
17080 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
17090 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
170a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
170b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
170c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
170d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
170e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
170f0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
17100 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
17110 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
17120 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
17130 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
17140 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
17150 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
17160 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
17170 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17180 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
17190 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
171a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
171b0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
171c0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
171d0 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
171e0 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
171f0 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
17200 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
17210 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
17220 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
17230 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
17240 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17250 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
17260 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
17270 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
17280 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17290 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
172a0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
172b0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
172c0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
172d0 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
172e0 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
172f0 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
17300 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
17310 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
17320 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
17330 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
17340 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17350 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17360 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
17370 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
17380 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
17390 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
173a0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
173b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
173c0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
173d0 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
173e0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
173f0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
17400 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
17410 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17420 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
17430 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
17440 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
17450 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
17460 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
17470 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
17480 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
17490 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
174a0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
174b0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
174c0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
174d0 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
174e0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
174f0 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17500 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17510 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17520 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17530 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17540 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17550 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17560 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
17570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17580 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
17590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
175a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
175b0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
175c0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
175d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
175e0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
175f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17600 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17610 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17620 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17630 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17640 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17650 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17660 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
17670 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
17680 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
17690 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
176a0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
176b0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
176c0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
176d0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
176e0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
176f0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17700 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17710 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17720 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17730 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17740 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17750 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17760 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
17770 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
17780 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
17790 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
177a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
177b0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
177c0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
177d0 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
177e0 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
177f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17810 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17820 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17830 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17840 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17850 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17860 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
17870 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
17880 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17890 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
178a0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
178b0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
178c0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
178d0 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
178e0 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
178f0 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17900 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17910 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17920 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17930 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17940 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17950 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17960 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
17970 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
17980 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17990 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
179a0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
179b0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
179c0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
179d0 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
179e0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
179f0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17a00 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17a10 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17a20 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17a30 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17a40 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17a50 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17a60 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
17a70 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
17a80 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17a90 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17aa0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17ab0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17ac0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17ad0 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17ae0 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17af0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17b00 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17b10 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17b20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17b30 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17b40 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17b50 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17b60 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
17b70 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
17b80 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17b90 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17ba0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17bb0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17bc0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17bd0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17be0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17bf0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17c10 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17c20 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17c30 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17c40 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17c50 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17c60 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17c70 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
17c80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17c90 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17ca0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17cb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17cc0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17cd0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17ce0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17cf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17d00 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17d10 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17d20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17d30 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17d40 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17d50 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17d60 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
17d70 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
17d80 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17d90 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
17da0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
17db0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17dc0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17dd0 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17de0 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17df0 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17e00 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17e10 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17e20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
17e30 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
17e40 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
17e50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
17e60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
17e70 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
17e80 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
17e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17ea0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
17eb0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
17ec0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17ed0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17ee0 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17ef0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17f00 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17f10 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17f20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17f30 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17f50 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17f60 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17f70 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17f80 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17f90 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17fa0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17fb0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17fc0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17fe0 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17ff0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18000 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
18010 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
18020 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
18030 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
18040 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
18050 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
18060 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
18070 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
18080 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
18090 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
180a0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
180b0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
180c0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
180d0 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
180e0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
180f0 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
18100 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
18110 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
18120 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
18130 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
18140 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
18150 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
18160 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
18170 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
18180 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
18190 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
181a0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
181b0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
181c0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
181d0 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
181e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
181f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18200 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
18210 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
18220 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
18230 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
18240 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
18250 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
18260 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
18270 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
18280 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
18290 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
182a0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
182b0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
182c0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
182d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
182e0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
182f0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18300 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
18310 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
18320 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
18330 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
18340 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
18350 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
18360 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
18370 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
18380 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
18390 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
183a0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
183b0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
183c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
183d0 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
183e0 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
183f0 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
18400 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
18410 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
18420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
18430 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
18440 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
18450 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18460 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
18470 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
18480 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
18490 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
184a0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
184b0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
184c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
184d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
184e0 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
184f0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18500 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18510 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18520 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18530 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18540 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18550 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18560 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
18570 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18580 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18590 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
185a0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
185b0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
185c0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
185d0 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
185e0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
185f0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18600 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18610 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18630 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18640 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18650 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18660 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18670 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18680 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
18690 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
186a0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
186b0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
186c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
186d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
186e0 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
186f0 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18700 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18710 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18720 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18730 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18740 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18750 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18760 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
18770 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
18780 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
18790 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
187a0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
187b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
187c0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
187d0 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
187e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
187f0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18800 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18810 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18820 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18830 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18840 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18850 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18860 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
18870 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
18880 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18890 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
188a0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
188b0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
188c0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
188d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
188e0 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
188f0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18900 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18910 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18920 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18930 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18940 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18950 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18960 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
18970 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
18980 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18990 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
189a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
189b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
189c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
189d0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
189e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
189f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18a00 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18a20 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18a30 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18a40 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18a60 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18a70 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
18a80 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18aa0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18ab0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18ac0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18ad0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18ae0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18af0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18b00 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18b10 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18b20 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18b30 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18b40 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18b50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18b60 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
18b70 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
18b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18b90 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18ba0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18bb0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18bc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18bd0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18be0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18bf0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18c00 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18c10 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18c20 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18c30 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18c40 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18c50 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
18c60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18c70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
18c80 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c90 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18ca0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18cb0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18cc0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18cd0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18ce0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18cf0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18d00 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d20 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18d30 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
18d40 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18d50 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
18d60 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
18d70 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
18d80 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
18d90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
18da0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18db0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
18dc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18dd0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18de0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18df0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18e00 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
18e30 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18e40 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
18e50 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
18e60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
18e70 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
18e80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18e90 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
18ea0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
18eb0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
18ec0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18ed0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18ee0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18ef0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18f00 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18f10 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18f20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
18f30 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
18f40 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18f50 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18f60 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18f70 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18f80 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18f90 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18fa0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18fd0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18fe0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18ff0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19000 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19010 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19020 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19040 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19050 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19070 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19080 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19090 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
190a0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
190b0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
190c0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
190d0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
190e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
190f0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19100 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19130 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19150 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19160 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19170 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19180 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19190 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
191a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
191b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
191c0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
191d0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
191e0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
191f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19200 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19210 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19220 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19230 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19240 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19250 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19260 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19270 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19280 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19290 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
192a0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
192b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
192c0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
192d0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
192e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
192f0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19300 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19310 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19330 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19340 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19350 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19360 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19370 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19380 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19390 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
193a0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
193b0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
193c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
193d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
193e0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
193f0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19400 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19410 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19420 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19430 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19440 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19450 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19460 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19470 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19480 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19490 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
194a0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
194b0 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
194c0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
194d0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
194e0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
194f0 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19500 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19510 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19520 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19530 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19540 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19550 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19560 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
19570 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
19580 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
19590 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
195a0 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
195b0 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
195c0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
195d0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
195e0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
195f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19610 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19620 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19630 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19640 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19650 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19660 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
19670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19680 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19690 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
196a0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
196b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
196c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
196d0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
196e0 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
196f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19700 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19710 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19720 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19730 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19740 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19750 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
19770 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
19780 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19790 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
197a0 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
197b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
197c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
197d0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
197e0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
197f0 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19800 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19810 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19820 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19830 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19840 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19850 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19860 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
19870 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19890 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
198a0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
198b0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
198c0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
198d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
198e0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
198f0 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19900 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19910 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19920 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19930 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19940 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19950 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19960 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
19970 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
19980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19990 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
199a0 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
199b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
199c0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
199d0 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
199e0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
199f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19a00 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19a10 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19a20 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19a50 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19a60 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
19a70 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
19a80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19aa0 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19ab0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19ac0 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19ad0 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19ae0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19af0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19b00 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19b10 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19b20 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
19b30 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
19b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19b50 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
19b60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19b70 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
19b80 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19b90 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
19ba0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
19bb0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19bc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19bd0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19be0 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
19bf0 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
19c00 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
19c10 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
19c20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
19c30 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
19c40 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
19c50 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
19c60 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
19c70 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19c80 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
19c90 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
19ca0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
19cb0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
19cc0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19cd0 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19ce0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19cf0 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19d00 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19d10 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19d20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
19d30 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
19d40 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
19d50 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
19d60 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
19d70 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19d80 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
19d90 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
19da0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
19db0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
19dc0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
19dd0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19de0 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
19df0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
19e00 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
19e10 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
19e20 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
19e30 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
19e40 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
19e50 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
19e60 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
19e70 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
19e80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
19e90 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19ea0 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
19eb0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
19ec0 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
19ed0 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
19ee0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19ef0 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
19f00 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
19f10 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
19f20 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
19f30 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
19f40 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
19f50 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
19f60 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
19f70 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
19f80 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
19f90 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
19fa0 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
19fb0 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
19fc0 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
19fd0 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
19fe0 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
19ff0 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a000 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a010 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a020 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a030 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a040 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a050 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a060 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a080 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a090 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a0a0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a0b0 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1a0c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1a0d0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1a0e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1a0f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1a100 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1a110 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1a130 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1a140 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a150 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a160 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1a170 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1a180 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a190 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1a1a0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1a1b0 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1a1c0 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1a1d0 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1a1e0 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1a1f0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1a200 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1a210 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1a220 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1a230 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1a240 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1a250 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a260 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1a270 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1a280 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1a290 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a2a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a2b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1a2c0 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1a2d0 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1a2e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a2f0 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1a300 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1a310 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1a320 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1a330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1a340 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1a350 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1a360 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1a370 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1a380 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1a390 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1a3a0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a3b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a3c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a3d0 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1a3e0 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1a3f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1a400 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1a410 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1a420 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1a430 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1a440 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1a450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1a460 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1a470 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a480 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a490 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1a4a0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1a4b0 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1a4c0 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1a4d0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1a4e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a4f0 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1a500 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1a510 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1a520 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1a530 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1a540 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a550 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a560 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1a570 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1a580 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1a590 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1a5a0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1a5b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a5c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1a5d0 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1a5e0 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1a5f0 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1a600 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1a610 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1a620 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1a630 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1a640 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1a650 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1a660 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1a670 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1a680 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1a690 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1a6a0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1a6b0 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1a6c0 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1a6d0 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1a6e0 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1a6f0 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1a700 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1a710 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1a720 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1a730 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1a740 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1a750 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1a760 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1a770 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1a780 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1a790 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a7a0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1a7b0 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1a7c0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a7d0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1a7e0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1a7f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a800 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1a810 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1a820 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1a830 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1a840 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1a850 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1a860 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1a870 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a880 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1a890 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1a8a0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1a8b0 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1a8c0 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1a8d0 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1a8e0 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1a8f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1a900 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1a910 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1a920 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1a930 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1a940 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1a950 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1a960 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1a970 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1a980 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1a990 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1a9a0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1a9b0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1a9c0 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1a9d0 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1a9e0 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1a9f0 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1aa00 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1aa10 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1aa20 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1aa30 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1aa40 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1aa50 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1aa60 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1aa70 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1aa80 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1aa90 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1aaa0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1aab0 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1aac0 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1aad0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1aae0 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1aaf0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1ab00 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1ab10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ab20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1ab30 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1ab40 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1ab50 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1ab60 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1ab70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ab80 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1ab90 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1aba0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1abb0 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1abc0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1abd0 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1abe0 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1abf0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1ac00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1ac10 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1ac20 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1ac30 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1ac40 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1ac50 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1ac60 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1ac70 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1ac80 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1ac90 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1aca0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1acb0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1acc0 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1acd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1ace0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1acf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1ad00 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1ad10 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1ad20 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1ad30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1ad40 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1ad50 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1ad60 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1ad70 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1ad80 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1ad90 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1ada0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1adb0 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1adc0 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1add0 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1ade0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1adf0 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1ae00 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1ae10 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1ae20 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1ae30 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1ae40 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1ae50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1ae60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ae70 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1ae80 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1ae90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1aea0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1aeb0 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1aec0 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1aed0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1aee0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1aef0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1af00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1af10 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1af20 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1af30 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1af40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1af60 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1af70 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1af80 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1af90 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1afa0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1afb0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1afc0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1afd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1afe0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1aff0 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b000 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b010 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b020 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b030 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b040 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1b050 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1b060 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1b070 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b080 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1b090 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1b0a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b0b0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b0c0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b0d0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b0e0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b0f0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b100 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b110 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b120 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b130 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b140 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b150 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b160 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b170 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b180 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1b190 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b1a0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1b1b0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1b1c0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1b1d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b1e0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1b1f0 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1b200 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1b210 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1b220 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1b230 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1b240 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1b250 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1b260 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1b270 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1b280 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1b290 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1b2a0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1b2b0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1b2c0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1b2d0 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1b2e0 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1b2f0 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1b300 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1b310 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1b320 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b330 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1b340 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1b350 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1b360 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1b370 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1b380 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1b390 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1b3a0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1b3b0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1b3c0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1b3d0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1b3e0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1b3f0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1b400 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1b410 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1b420 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1b430 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1b440 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1b450 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1b460 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1b470 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1b480 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1b490 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1b4a0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1b4b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b4c0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1b4d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b4e0 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1b4f0 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1b500 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1b510 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1b520 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1b530 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1b540 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1b550 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1b560 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1b570 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1b580 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1b590 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1b5a0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1b5b0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1b5c0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b5d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b5e0 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b5f0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b600 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b620 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b630 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b640 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b650 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b660 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b670 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b680 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b690 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b6a0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b6b0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b6c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b6d0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b6e0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b6f0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b700 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b730 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b750 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b760 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b770 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b780 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b790 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b7a0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b7b0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b7c0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b7d0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1b7e0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1b7f0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1b800 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1b810 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1b820 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1b830 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1b840 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1b850 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1b860 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1b870 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1b880 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1b890 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1b8a0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1b8b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b8c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b8d0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b8e0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1b8f0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b900 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1b910 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1b920 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b930 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b940 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1b950 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1b960 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1b970 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1b980 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b990 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b9a0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b9b0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b9c0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b9d0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b9e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b9f0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1ba00 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1ba10 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1ba20 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1ba30 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1ba40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1ba50 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1ba60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1ba70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1ba80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ba90 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1baa0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1bab0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1bac0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1bad0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1bae0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1baf0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1bb00 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1bb10 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1bb20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1bb30 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1bb40 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1bb50 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1bb60 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1bb70 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1bb80 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1bb90 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1bba0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1bbb0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1bbc0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1bbd0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1bbe0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1bbf0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1bc00 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1bc10 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1bc20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1bc30 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1bc40 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1bc50 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1bc60 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1bc70 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bc80 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1bc90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bca0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1bcb0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1bcc0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1bcd0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1bce0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bcf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bd00 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1bd10 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bd20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bd30 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1bd40 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1bd50 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bd60 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1bd70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bd80 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1bd90 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1bda0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1bdb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bdc0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bdd0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1bde0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1bdf0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1be00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1be10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1be20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1be30 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1be40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1be50 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1be60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1be70 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1be80 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1be90 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1bea0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1beb0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1bec0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1bed0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1bee0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1bef0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1bf00 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1bf10 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1bf20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1bf30 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1bf40 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1bf50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1bf60 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1bf70 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1bf80 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1bf90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1bfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfb0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1bfc0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1bfd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1bfe0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1bff0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c000 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c010 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c020 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c030 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c040 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c050 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c060 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c070 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c080 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c090 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c0a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c0b0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1c0c0 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1c0d0 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1c0e0 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1c0f0 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1c100 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1c110 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1c120 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1c130 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1c140 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1c150 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1c160 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1c170 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1c180 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1c190 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1c1a0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1c1b0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1c1c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c1d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c1e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c1f0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1c200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c210 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1c220 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1c230 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1c240 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1c250 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1c260 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1c270 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1c280 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1c290 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1c2a0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1c2b0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1c2c0 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1c2d0 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1c2e0 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1c2f0 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1c300 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1c310 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1c320 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1c330 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c340 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c360 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1c370 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1c380 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1c390 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1c3a0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1c3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c3c0 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1c3d0 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1c3e0 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1c3f0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1c400 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c410 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1c420 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1c430 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1c440 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1c450 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1c460 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1c470 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1c480 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1c490 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1c4a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c4b0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1c4c0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c4d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1c4e0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1c4f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1c500 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1c510 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1c520 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1c530 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1c540 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1c550 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1c560 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1c570 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1c580 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1c590 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1c5a0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1c5b0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1c5c0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1c5d0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1c5e0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1c5f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1c600 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1c610 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1c620 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1c630 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1c640 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1c650 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1c660 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1c670 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1c680 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1c690 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1c6a0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1c6b0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1c6c0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1c6d0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1c6e0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1c6f0 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1c700 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1c710 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1c720 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1c730 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1c740 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1c750 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1c760 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1c770 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1c780 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1c790 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c7a0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1c7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1c7c0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1c7d0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1c7e0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1c7f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1c800 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1c810 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1c820 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1c830 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c840 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c860 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1c870 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1c880 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1c890 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1c8a0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1c8b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c8c0 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 29  agerSync(pPager)
1c8d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1c8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c8f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1c900 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1c910 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1c920 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1c930 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c940 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c960 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1c970 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1c980 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1c990 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1c9a0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1c9b0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1c9c0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1c9d0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1c9e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1c9f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1ca00 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1ca10 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1ca20 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1ca30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1ca40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1ca50 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1ca60 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1ca70 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1ca80 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1ca90 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1caa0 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1cab0 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1cad0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1cae0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1caf0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1cb00 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1cb10 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1cb20 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1cb30 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1cb40 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1cb50 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1cb60 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1cb70 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1cb80 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1cb90 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1cba0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1cbb0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1cbc0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1cbd0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1cbe0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1cbf0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1cc00 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1cc10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cc20 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1cc30 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1cc40 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1cc50 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1cc60 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1cc70 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1cc80 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1cc90 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1cca0 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1ccb0 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1ccc0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1ccd0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1cce0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1ccf0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1cd00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1cd10 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1cd20 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1cd30 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1cd40 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1cd50 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1cd60 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1cd70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1cd80 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1cd90 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1cda0 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1cdb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1cdc0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1cdd0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1cde0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1cdf0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1ce00 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1ce10 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1ce20 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1ce30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1ce40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1ce50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ce60 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1ce70 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1ce80 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1ce90 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1cea0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1ceb0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1cec0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1ced0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1cee0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1cef0 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1cf00 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1cf10 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1cf20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cf30 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1cf40 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1cf50 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1cf60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1cf70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cf80 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1cf90 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66  TE_OMIT_WAL.  if
1cfa0 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1cfb0 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1cfc0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1cfd0 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1cfe0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1cff0 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1d000 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1d010 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50  iFrame, pgsz, pP
1d020 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c  g->pData);.  }el
1d030 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1d040 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
1d050 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1d060 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1d070 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d080 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1d090 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1d0a0 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
1d0b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d0c0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d0d0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1d0e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d0f0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1d100 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1d110 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1d120 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1d130 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1d140 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1d150 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1d160 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1d170 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1d180 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1d190 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1d1a0 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1d1b0 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1d1c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d1d0 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1d1e0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1d1f0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1d200 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1d210 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d220 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1d230 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1d240 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1d250 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1d260 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1d270 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1d280 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1d290 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1d2a0 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1d2b0 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1d2c0 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1d2d0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1d2e0 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1d2f0 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1d300 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1d310 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1d320 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1d330 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1d340 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1d350 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1d360 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1d370 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
1d380 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1d390 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1d3a0 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1d3b0 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1d3c0 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1d3d0 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1d3e0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d3f0 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1d400 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1d410 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1d420 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1d430 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1d440 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1d450 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1d460 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d470 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1d480 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1d490 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1d4a0 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1d4b0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1d4c0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1d4d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
1d4e0 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1d4f0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1d500 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1d510 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1d520 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1d530 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1d540 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1d550 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1d560 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1d570 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1d580 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d590 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1d5a0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1d5b0 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1d5c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d5d0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1d5e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1d5f0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1d600 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1d610 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1d620 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1d630 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1d640 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1d650 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1d660 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1d670 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1d680 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1d690 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1d6a0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1d6b0 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1d6c0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d6d0 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1d6e0 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1d6f0 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1d700 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1d710 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1d720 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1d730 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d740 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1d750 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1d760 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1d770 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1d780 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1d790 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1d7a0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1d7b0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1d7c0 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1d7d0 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1d7e0 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1d7f0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1d800 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1d810 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d820 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1d830 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1d840 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1d850 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1d860 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1d870 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1d880 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1d890 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1d8a0 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1d8b0 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1d8c0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1d8d0 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1d8e0 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1d8f0 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1d900 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1d910 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1d920 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1d930 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1d940 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1d950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d960 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1d970 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1d980 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1d990 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1d9a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1d9b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1d9c0 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1d9d0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1d9e0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1d9f0 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1da00 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1da10 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1da20 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1da30 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1da40 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1da50 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1da60 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1da70 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1da80 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1da90 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1daa0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1dab0 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1dac0 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1dad0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1dae0 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1daf0 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1db00 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1db10 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1db20 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1db30 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1db40 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1db50 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1db60 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1db70 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1db80 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1db90 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1dba0 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1dbb0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1dbc0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1dbd0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1dbe0 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1dbf0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1dc00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1dc10 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1dc20 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1dc30 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
1dc40 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1dc50 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67  pPager) );.  pPg
1dc60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
1dc70 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
1dc80 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
1dc90 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1dca0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
1dcb0 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
1dcc0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1dcd0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
1dce0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
1dcf0 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20   iFrame = 0;.   
1dd00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1dd10 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
1dd20 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70  er->pWal, pPg->p
1dd30 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
1dd40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1dd50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dd60 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1dd70 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
1dd80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1dd90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dda0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1ddb0 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1ddc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ddd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1dde0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ef(pPg);.    }. 
1ddf0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
1de00 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
1de10 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1de20 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
1de30 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
1de40 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
1de50 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
1de60 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1de70 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
1de80 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1de90 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
1dea0 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
1deb0 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
1dec0 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
1ded0 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
1dee0 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
1def0 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
1df00 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
1df10 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
1df20 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
1df30 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1df40 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
1df50 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
1df60 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
1df70 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
1df80 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
1df90 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
1dfa0 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
1dfb0 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
1dfc0 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
1dfd0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
1dfe0 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
1dff0 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
1e000 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e010 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e020 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
1e030 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1e040 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
1e050 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1e060 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
1e070 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1e080 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1e0b0 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
1e0c0 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
1e0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1e0e0 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1e0f0 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
1e100 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
1e110 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
1e120 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
1e130 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
1e140 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
1e150 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
1e160 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
1e170 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
1e180 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
1e190 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
1e1a0 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
1e1b0 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
1e1c0 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
1e1d0 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
1e1e0 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
1e1f0 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1e200 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
1e210 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
1e220 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1e230 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1e240 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1e250 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
1e260 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
1e270 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
1e280 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
1e290 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1e2a0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1e2b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1e2c0 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
1e2d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e2e0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
1e2f0 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
1e300 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
1e310 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1e320 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1e330 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1e340 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
1e350 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1e360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e370 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
1e380 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1e390 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
1e3a0 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
1e3b0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
1e3c0 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
1e3d0 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
1e3e0 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
1e3f0 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
1e400 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1e410 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
1e420 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
1e430 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
1e440 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
1e450 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nged. .**.** The
1e460 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70   list of pages p
1e470 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20  assed into this 
1e480 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79  routine is alway
1e490 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65  s sorted by page
1e4a0 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63   number..** Henc
1e4b0 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70  e, if page 1 app
1e4c0 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e  ears anywhere on
1e4d0 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69   the list, it wi
1e4e0 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ll be the first 
1e4f0 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  page..*/ .static
1e500 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61   int pagerWalFra
1e510 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  mes(.  Pager *pP
1e520 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
1e530 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1e540 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64  object */.  PgHd
1e550 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  r *pList,       
1e560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1e570 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f  ist of frames to
1e580 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e   log */.  Pgno n
1e590 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1e5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1e5b0 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72  abase size after
1e5c0 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a   this commit */.
1e5d0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1e600 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f  s is a commit */
1e610 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e640 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  code */.  int nL
1e650 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1e660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e670 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1e680 70 4c 69 73 74 20 2a 2f 0a 23 69 66 20 64 65 66  pList */.#if def
1e690 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1e6a0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1e6b0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1e6c0 29 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  ).  PgHdr *p;   
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1e6f0 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1e700 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1e710 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  t( pPager->pWal 
1e720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
1e730 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  st );.#ifdef SQL
1e740 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
1e750 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70  erify that the p
1e760 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61  age list is in a
1e770 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  ccending order *
1e780 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  /.  for(p=pList;
1e790 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b   p && p->pDirty;
1e7a0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1e7b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67     assert( p->pg
1e7c0 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e  no < p->pDirty->
1e7d0 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  pgno );.  }.#end
1e7e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  if..  assert( pL
1e7f0 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c  ist->pDirty==0 |
1e800 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20  | isCommit );.  
1e810 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  if( isCommit ){.
1e820 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20      /* If a WAL 
1e830 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
1e840 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20  eing committed, 
1e850 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
1e860 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20  t in writing.   
1e870 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69   ** any pages wi
1e880 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
1e890 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72  greater than nTr
1e8a0 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20  uncate into the 
1e8b0 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  WAL file..    **
1e8c0 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72   They will never
1e8d0 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20   be read by any 
1e8e0 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76  client. So remov
1e8f0 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
1e900 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69  pDirty.    ** li
1e910 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  st here. */.    
1e920 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67  PgHdr *p;.    Pg
1e930 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26  Hdr **ppNext = &
1e940 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74  pList;.    nList
1e950 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 0;.    for(p=
1e960 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1e970 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44  = p)!=0; p=p->pD
1e980 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28  irty){.      if(
1e990 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63   p->pgno<=nTrunc
1e9a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
1e9b0 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1e9c0 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73  ty;.        nLis
1e9d0 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
1e9e0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1e9f0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
1ea00 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a  .    nList = 1;.
1ea10 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53    }.  pPager->aS
1ea20 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
1ea30 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a  RITE] += nList;.
1ea40 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1ea50 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
1ea60 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1ea70 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d  r(pList);.  rc =
1ea80 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1ea90 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  s(pPager->pWal, 
1eaa0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1eab0 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20  ageSize, pList, 
1eac0 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d  nTruncate, isCom
1ead0 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c  mit, pPager->wal
1eae0 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20  SyncFlags.  );. 
1eaf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1eb00 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42  OK && pPager->pB
1eb10 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48  ackup ){.    PgH
1eb20 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
1eb30 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1eb40 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73  pDirty){.      s
1eb50 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1eb60 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1eb70 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38  up, p->pgno, (u8
1eb80 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20   *)p->pData);.  
1eb90 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
1eba0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1ebb0 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  ES.  pList = sql
1ebc0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1ebd0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1ebe0 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c  che);.  for(p=pL
1ebf0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1ec00 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  rty){.    pager_
1ec10 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b  set_pagehash(p);
1ec20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1ec30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ec40 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
1ec50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1ec60 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
1ec70 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
1ec80 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
1ec90 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
1eca0 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
1ecb0 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
1ecc0 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
1ecd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
1ece0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
1ecf0 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
1ed00 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
1ed10 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
1ed20 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
1ed30 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
1ed40 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
1ed50 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
1ed60 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
1ed70 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
1ed80 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
1ed90 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
1eda0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1edb0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1ede0 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
1edf0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1ee00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ee10 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
1ee20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
1ee30 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1ee40 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
1ee50 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1ee60 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
1ee70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1ee80 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
1ee90 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61  ..  /* sqlite3Wa
1eea0 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1eeb0 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ion() was not ca
1eec0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65  lled for the pre
1eed0 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73  vious.  ** trans
1eee0 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e  action in lockin
1eef0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
1ef00 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f  .  So call it no
1ef10 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61  w.  If we.  ** a
1ef20 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  re in locking_mo
1ef30 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e  de=NORMAL and En
1ef40 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76  dRead() was prev
1ef50 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20  iously called,. 
1ef60 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74   ** the duplicat
1ef70 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65  e call is harmle
1ef80 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
1ef90 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1efa0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1efb0 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pWal);..  rc = s
1efc0 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65  qlite3WalBeginRe
1efd0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1efe0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61  ager->pWal, &cha
1eff0 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21  nged);.  if( rc!
1f000 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68  =SQLITE_OK || ch
1f010 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67  anged ){.    pag
1f020 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1f030 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
1f040 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
1f050 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
1f060 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
1f070 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f080 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1f090 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f0a0 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
1f0b0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
1f0c0 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
1f0d0 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
1f0e0 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
1f0f0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1f100 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f110 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
1f120 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
1f130 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
1f140 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1f150 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
1f160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
1f170 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
1f180 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f190 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
1f1a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1f1b0 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
1f1c0 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
1f1d0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
1f1e0 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
1f1f0 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
1f200 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
1f210 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
1f220 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
1f230 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
1f240 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
1f250 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1f260 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
1f270 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1f2a0 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
1f2b0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
1f2c0 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1f2d0 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
1f2e0 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
1f2f0 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
1f300 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1f310 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
1f320 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
1f330 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
1f340 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
1f350 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1f360 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1f370 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1f380 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
1f390 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
1f3a0 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f3b0 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
1f3c0 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
1f3d0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
1f3e0 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
1f3f0 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
1f400 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1f410 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f420 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
1f430 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1f440 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
1f450 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
1f460 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
1f470 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
1f480 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1f490 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61  e size was not a
1f4a0 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1f4b0 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1f4c0 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ,.  ** determine
1f4d0 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65   it based on the
1f4e0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f4f0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1f500 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  he size.  ** of 
1f510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f520 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  e is not an inte
1f530 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
1f540 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20  the page-size,. 
1f550 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74   ** round down t
1f560 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 70 61  o the nearest pa
1f570 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20  ge. Except, any 
1f580 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  file larger than
1f590 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e   0.  ** bytes in
1f5a0 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65   size is conside
1f5b0 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  red to contain a
1f5c0 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
1f5d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1f5e0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34  ge==0 ){.    i64
1f5f0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1f600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1f610 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1f620 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73   bytes */.    as
1f630 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1f640 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1f650 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1f660 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1f670 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1f680 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1f690 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1f6a0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
1f6b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f6c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f6d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f6e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f6f0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28  nPage = (Pgno)((
1f700 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n+pPager->pageSi
1f710 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e  ze-1) / pPager->
1f720 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
1f730 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1f740 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1f750 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1f760 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1f770 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
1f780 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
1f790 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
1f7a0 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
1f7b0 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
1f7c0 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
1f7d0 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
1f7e0 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
1f7f0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
1f800 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1f810 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
1f820 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
1f830 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1f840 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
1f850 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f860 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
1f870 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1f880 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
1f890 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
1f8a0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
1f8b0 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
1f8c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f8d0 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
1f8e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
1f8f0 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
1f900 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
1f910 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
1f920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f930 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
1f940 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1f950 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
1f960 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
1f970 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
1f980 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
1f990 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
1f9a0 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1f9b0 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
1f9c0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
1f9d0 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
1f9e0 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
1f9f0 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
1fa00 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
1fa10 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
1fa20 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
1fa30 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1fa40 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
1fa50 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
1fa60 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
1fa70 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
1fa80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fa90 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
1faa0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
1fab0 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
1fac0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
1fad0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
1fae0 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
1faf0 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
1fb00 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
1fb10 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
1fb20 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
1fb30 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
1fb40 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
1fb50 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
1fb60 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
1fb70 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
1fb80 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
1fb90 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1fba0 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
1fbb0 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
1fbc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1fbd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1fbe0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fbf0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1fc00 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1fc10 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1fc20 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1fc30 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1fc40 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1fc50 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fc70 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
1fc80 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
1fc90 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fcb0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
1fcc0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1fcd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
1fce0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
1fcf0 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
1fd00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1fd10 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1fd20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1fd30 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1fd40 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1fd50 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
1fd60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1fd70 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
1fd80 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51  _NOENT ) rc = SQ
1fd90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1fda0 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
1fdb0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1fdc0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1fdd0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1fde0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
1fdf0 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
1fe00 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
1fe10 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
1fe20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1fe30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fe40 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
1fe50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1fe60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1fe70 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
1fe80 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
1fe90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1fea0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
1feb0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
1fec0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1fed0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1fee0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1fef0 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
1ff00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1ff10 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
1ff20 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
1ff30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ff40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ff50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ff60 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
1ff70 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
1ff80 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
1ff90 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
1ffa0 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
1ffb0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
1ffc0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
1ffd0 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
1ffe0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
1fff0 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
20000 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
20010 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
20020 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
20030 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
20040 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
20050 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
20060 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
20070 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
20080 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
20090 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
200a0 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
200b0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
200c0 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
200d0 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
200e0 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
200f0 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
20100 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
20110 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
20120 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
20130 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20140 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
20150 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
20160 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20170 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20180 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
20190 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
201a0 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
201b0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
201c0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
201d0 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
201e0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
201f0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
20200 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
20210 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
20220 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
20230 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
20240 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
20250 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
20260 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
20270 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
20280 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
20290 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
202a0 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
202b0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
202c0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
202d0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
202e0 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
202f0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
20300 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
20310 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
20320 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
20330 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
20340 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
20350 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
20360 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
20370 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
20380 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
20390 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
203a0 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
203b0 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
203c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
203d0 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
203e0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
203f0 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
20400 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
20410 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
20420 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
20430 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
20440 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
20450 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
20460 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
20470 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
20480 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
20490 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
204a0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
204b0 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
204c0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
204d0 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
204e0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
204f0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
20500 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
20510 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
20520 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
20530 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
20540 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
20550 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
20560 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
20570 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
20580 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
20590 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
205a0 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
205b0 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
205c0 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
205d0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
205e0 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
205f0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
20600 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
20610 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
20620 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
20630 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
20640 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
20650 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20660 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
20670 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
20680 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
20690 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
206a0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
206b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
206c0 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
206d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
206e0 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
206f0 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
20700 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
20710 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20720 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
20730 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
20740 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
20750 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
20760 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
20770 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
20780 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
20790 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
207a0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
207b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
207c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
207d0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
207e0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
207f0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
20800 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
20810 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
20820 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
20830 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
20840 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
20850 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
20860 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
20870 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
20880 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
20890 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
208a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
208b0 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
208c0 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
208d0 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
208e0 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
208f0 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
20900 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
20910 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
20920 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
20930 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
20940 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
20950 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
20960 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  ze;.  pPager->ch
20970 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
20980 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20990 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
209a0 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
209b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
209c0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
209d0 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
209e0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
209f0 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
20a00 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
20a10 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
20a20 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
20a30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
20a40 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
20a50 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
20a60 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
20a70 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20a80 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
20a90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20aa0 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
20ab0 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
20ac0 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
20ad0 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
20ae0 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
20af0 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
20b00 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
20b10 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
20b20 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
20b30 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
20b40 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
20b50 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
20b60 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
20b70 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
20b80 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
20b90 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
20ba0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
20bb0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
20bc0 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
20bd0 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
20be0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
20bf0 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
20c00 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
20c10 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
20c20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
20c30 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
20c40 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
20c50 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
20c60 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
20c70 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
20c80 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
20c90 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
20ca0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
20cb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
20cc0 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
20cd0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20ce0 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
20cf0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
20d00 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
20d10 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
20d20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
20d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20d40 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
20d50 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
20d60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20d70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20d80 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
20d90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
20da0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
20db0 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
20dc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
20dd0 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
20de0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
20df0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
20e00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
20e10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20e20 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
20e30 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
20e40 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
20e50 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
20e60 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20e70 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
20e80 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
20e90 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
20ea0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
20eb0 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
20ec0 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
20ed0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
20ee0 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
20ef0 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
20f00 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
20f10 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
20f20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
20f30 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
20f40 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
20f50 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
20f60 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
20f70 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
20f80 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
20f90 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
20fa0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
20fb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
20fc0 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
20fd0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
20fe0 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
20ff0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
21000 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
21010 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
21020 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21030 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
21040 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
21050 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
21060 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
21070 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
21080 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
21090 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
210a0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
210b0 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
210c0 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
210d0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
210e0 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
210f0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
21100 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
21110 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
21120 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
21130 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
21140 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
21150 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
21160 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
21170 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
21180 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
21190 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
211a0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
211b0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
211c0 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
211d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
211e0 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
211f0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
21200 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
21210 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
21220 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
21230 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
21240 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
21250 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21260 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21270 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
21280 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21290 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
212a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
212b0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
212c0 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
212d0 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
212e0 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
212f0 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
21300 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
21310 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
21320 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
21330 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
21340 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
21350 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
21360 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
21370 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
21380 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
21390 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
213a0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
213b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
213c0 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
213d0 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65  set = (i64)pSave
213e0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
213f0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
21400 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  ze);..    if( pa
21410 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21420 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
21430 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
21440 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  intUndo(pPager->
21450 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74  pWal, pSavepoint
21460 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20  ->aWalData);.   
21470 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53   }.    for(ii=pS
21480 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
21490 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
214a0 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
214b0 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
214c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
214d0 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b  set==(i64)ii*(4+
214e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
214f0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
21500 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21510 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21520 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20  &offset, pDone, 
21530 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
21540 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21550 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
21560 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
21570 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
21580 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21590 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
215a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
215b0 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  szJ;.  }..  retu
215c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
215d0 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
215e0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
215f0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
21600 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
21610 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21620 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
21630 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
21640 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
21650 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
21660 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
21670 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
21680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
21690 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
216a0 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f  MAP_SIZE based o
216b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
216c0 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a  lue of szMmap..*
216d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
216e0 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50  gerFixMaplimit(P
216f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
21700 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
21710 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69  AP_SIZE>0.  sqli
21720 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70  te3_file *fd = p
21730 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28  Pager->fd;.  if(
21740 20 69 73 4f 70 65 6e 28 66 64 29 20 29 7b 0a 20   isOpen(fd) ){. 
21750 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
21760 20 73 7a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   sz;.    pPager-
21770 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 66 64  >bUseFetch = (fd
21780 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
21790 73 69 6f 6e 3e 3d 33 29 20 26 26 20 70 50 61 67  sion>=3) && pPag
217a0 65 72 2d 3e 73 7a 4d 6d 61 70 3e 30 3b 0a 20 20  er->szMmap>0;.  
217b0 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73    sz = pPager->s
217c0 7a 4d 6d 61 70 3b 0a 20 20 20 20 73 71 6c 69 74  zMmap;.    sqlit
217d0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
217e0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
217f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
21800 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20  P_SIZE, &sz);.  
21810 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
21820 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
21830 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79  imum size of any
21840 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
21850 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  made of the data
21860 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  base file..*/.vo
21870 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
21880 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65  etMmapLimit(Page
21890 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74  r *pPager, sqlit
218a0 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
218b0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d  {.  pPager->szMm
218c0 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70  ap = szMmap;.  p
218d0 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
218e0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
218f0 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d  * Free as much m
21900 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
21910 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
21920 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21930 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67  3PagerShrink(Pag
21940 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
21950 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69  qlite3PcacheShri
21960 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nk(pPager->pPCac
21970 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  he);.}../*.** Ad
21980 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
21990 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
219a0 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
219b0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
219c0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
219d0 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
219e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
219f0 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
21a00 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
21a10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
21a20 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
21a30 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
21a40 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
21a50 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
21a60 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
21a70 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
21a80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21a90 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
21aa0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
21ab0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
21ac0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
21ad0 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
21ae0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
21af0 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
21b00 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
21b10 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
21b20 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
21b30 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
21b40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21b50 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
21b60 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
21b70 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
21b80 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
21b90 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
21ba0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
21bb0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
21bc0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
21be0 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
21bf0 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
21c00 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
21c10 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21c20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
21c30 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
21c40 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
21c50 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
21c60 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
21c70 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
21c80 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
21c90 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
21ca0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
21cb0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
21cc0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
21cd0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21ce0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
21cf0 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
21d00 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
21d10 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
21d20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
21d30 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
21d40 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
21d60 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
21d70 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
21d80 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
21d90 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
21da0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
21db0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
21dc0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
21dd0 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
21de0 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
21df0 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
21e00 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
21e10 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
21e20 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ack..**.** The a
21e30 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f  bove is for a ro
21e40 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d  llback-journal m
21e50 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f  ode.  For WAL mo
21e60 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65  de, OFF continue
21e70 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61  s.** to mean tha
21e80 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20  t no syncs ever 
21e90 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d  occur.  NORMAL m
21ea0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
21eb0 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70  L is synced.** p
21ec0 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
21ed0 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20  t of checkpoint 
21ee0 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
21ef0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79  abase file is sy
21f00 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63  nced.** at the c
21f10 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65  onclusion of the
21f20 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74   checkpoint if t
21f30 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
21f40 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20  t of the WAL.** 
21f50 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b  was written back
21f60 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
21f70 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63  se.  But no sync
21f80 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
21f90 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69  r for.** an ordi
21fa0 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e  nary commit in N
21fb0 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20  ORMAL mode with 
21fc0 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73  WAL.  FULL means
21fd0 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a   that the WAL.**
21fe0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
21ff0 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63  following each c
22000 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c  ommit operation,
22010 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   in addition to 
22020 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73  the.** syncs ass
22030 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52  ociated with NOR
22040 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  MAL..**.** Do no
22050 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72  t confuse synchr
22060 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20  onous=FULL with 
22070 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22080 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
22090 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f  _SYNC_FULL macro
220a0 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68   means to use th
220b0 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66  e MacOSX-style f
220c0 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69  ull-fsync.** usi
220d0 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46  ng fcntl(F_FULLF
220e0 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53  SYNC).  SQLITE_S
220f0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  YNC_NORMAL means
22100 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64   to do an.** ord
22110 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61  inary fsync() ca
22120 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ll.  There is no
22130 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
22140 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  een SQLITE_SYNC_
22150 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  FULL.** and SQLI
22160 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
22170 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65  n platforms othe
22180 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20  r than MacOSX.  
22190 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68  But the.** synch
221a0 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73  ronous=FULL vers
221b0 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  us synchronous=N
221c0 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65  ORMAL setting de
221d0 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a  termines when.**
221e0 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69   the xSync primi
221f0 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tive is called a
22200 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74  nd is relevant t
22210 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e  o all platforms.
22220 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
22230 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
22240 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
22250 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
22260 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
22270 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
22280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
22290 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
222a0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
222b0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20  tSafetyLevel(.  
222c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
222d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
222e0 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79  er to set safety
222f0 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20   level for */.  
22300 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20 20 20  int level,      
22310 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
22320 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d  synchronous.  1=
22330 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33  OFF, 2=NORMAL, 3
22340 3d 46 55 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74  =FULL */  .  int
22350 20 62 46 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20   bFullFsync,    
22360 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c     /* PRAGMA ful
22370 6c 66 73 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20  lfsync */.  int 
22380 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 20  bCkptFullFsync  
22390 20 20 2f 2a 20 50 52 41 47 4d 41 20 63 68 65 63    /* PRAGMA chec
223a0 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63  kpoint_fullfsync
223b0 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
223c0 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
223d0 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65  el<=3 );.  pPage
223e0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
223f0 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
22400 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
22410 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
22420 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
22430 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
22440 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69  pFile) ?1:0;.  i
22450 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
22460 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22470 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
22480 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22490 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
224a0 20 7d 65 6c 73 65 20 69 66 28 20 62 46 75 6c 6c   }else if( bFull
224b0 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  Fsync ){.    pPa
224c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
224d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
224e0 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
224f0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
22500 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
22510 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43 6b  .  }else if( bCk
22520 70 74 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20  ptFullFsync ){. 
22530 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22540 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22550 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
22560 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22570 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22580 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
22590 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
225a0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
225b0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
225c0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
225d0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
225e0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
225f0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
22600 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
22610 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
22620 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
22630 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
22640 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
22650 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41   |= WAL_SYNC_TRA
22660 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d  NSACTIONS;.  }.}
22670 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
22680 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
22690 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
226a0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
226b0 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
226c0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
226d0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
226e0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
226f0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
22700 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
22710 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
22720 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
22730 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
22740 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
22750 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
22760 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
22770 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
22780 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
22790 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
227a0 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
227b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
227c0 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
227d0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
227e0 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
227f0 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
22800 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
22810 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
22820 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
22830 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
22840 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
22850 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
22860 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
22870 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
22880 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
22890 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
228a0 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
228b0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
228c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
228d0 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
228e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
228f0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
22900 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
22910 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
22920 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
22930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
22940 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
22950 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
22960 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
22970 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
22980 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
22990 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
229a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
229b0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
229c0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
229d0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
229e0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
229f0 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
22a00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
22a10 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
22a20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
22a30 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
22a40 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
22a50 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
22a60 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
22a70 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
22a80 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
22a90 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
22aa0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
22ab0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
22ac0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
22ad0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
22ae0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
22af0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
22b00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
22b10 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
22b20 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
22b30 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
22b40 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22b50 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
22b60 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
22b70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
22b80 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
22b90 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
22ba0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
22bb0 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
22bc0 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
22bd0 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
22be0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
22bf0 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
22c00 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
22c10 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
22c20 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
22c30 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
22c40 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
22c50 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
22c60 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
22c70 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
22c80 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
22c90 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
22ca0 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
22cb0 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
22cc0 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
22cd0 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
22ce0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
22cf0 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
22d00 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
22d10 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
22d20 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
22d30 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
22d60 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
22d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22da0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
22db0 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
22dc0 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
22dd0 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
22de0 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
22df0 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
22e00 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
22e10 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
22e20 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
22e30 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
22e40 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
22e50 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
22e60 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
22e70 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
22e80 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
22e90 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
22ea0 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
22eb0 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
22ec0 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
22ed0 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
22ee0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
22ef0 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
22f00 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
22f10 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22f20 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
22f30 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22f50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
22f60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
22f70 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
22f80 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
22f90 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22fa0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
22fb0 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
22fc0 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
22ff0 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
23000 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ler */.){.  pPag
23010 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
23020 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
23030 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
23040 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
23050 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20  syHandlerArg;.. 
23060 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
23070 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76  er->fd) ){.    v
23080 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64  oid **ap = (void
23090 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75   **)&pPager->xBu
230a0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61  syHandler;.    a
230b0 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28  ssert( ((int(*)(
230c0 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29  void *))(ap[0]))
230d0 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29  ==xBusyHandler )
230e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
230f0 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65  [1]==pBusyHandle
23100 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69  rArg );.    sqli
23110 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
23120 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
23130 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55   SQLITE_FCNTL_BU
23140 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64  SYHANDLER, (void
23150 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   *)ap);.  }.}../
23160 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
23170 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
23180 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
23190 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
231a0 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
231b0 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
231c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
231d0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
231e0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
231f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
23200 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
23210 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
23220 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
23230 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
23240 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
23250 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
23260 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
23270 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
23280 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
23290 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
232a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
232b0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
232c0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
232d0 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
232e0 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
232f0 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
23300 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
23310 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
23320 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
23330 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
23340 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
23350 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
23360 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
23370 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
23380 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
23390 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
233a0 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
233b0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
233c0 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
233d0 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
233e0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
233f0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
23400 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
23410 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
23420 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
23430 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
23440 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
23450 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
23460 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
23470 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
23480 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
23490 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
234a0 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
234b0 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
234c0 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
234d0 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
234e0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
234f0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
23500 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
23510 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
23520 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
23530 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
23540 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
23550 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
23560 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
23570 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
23580 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
23590 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
235a0 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
235b0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
235c0 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
235d0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
235e0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
235f0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
23600 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
23610 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
23620 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
23630 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
23640 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
23650 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
23660 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
23670 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
23680 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
23690 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
236a0 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
236b0 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
236c0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
236d0 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
236e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
236f0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
23700 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
23710 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
23720 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
23730 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
23740 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
23750 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
23760 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
23770 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
23780 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
23790 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
237a0 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
237b0 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
237c0 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
237d0 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
237e0 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
237f0 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
23800 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
23810 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
23820 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
23830 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
23840 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
23850 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
23860 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
23870 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
23880 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
23890 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
238a0 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
238b0 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
238c0 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
238d0 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
238e0 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
238f0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
23900 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
23910 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
23920 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
23930 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
23940 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
23950 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
23960 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
23970 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
23980 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
23990 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
239a0 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
239b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
239c0 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
239d0 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
239e0 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
239f0 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
23a00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
23a10 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
23a20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
23a30 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
23a40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
23a50 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
23a60 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
23a70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23a80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23a90 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
23aa0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
23ab0 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
23ac0 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63    if( !pNew ) rc
23ad0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23b00 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
23b10 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
23b20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
23b30 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65   = (Pgno)((nByte
23b40 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67  +pageSize-1)/pag
23b50 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
23b60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
23b70 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
23b80 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
23b90 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
23ba0 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
23bb0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
23bc0 4e 65 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  New;.      sqlit
23bd0 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
23be0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
23bf0 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
23c00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
23c10 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
23c20 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
23c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23c40 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  ){.    if( nRese
23c50 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
23c60 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
23c70 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
23c80 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
23c90 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
23ca0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
23cb0 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
23cc0 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
23cd0 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
23ce0 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78  r);.    pagerFix
23cf0 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
23d00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23d10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23d20 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23d30 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
23d40 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
23d50 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
23d60 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
23d70 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
23d80 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
23d90 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
23da0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
23db0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
23dc0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
23dd0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
23de0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
23df0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
23e00 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
23e10 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
23e20 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
23e30 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
23e40 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
23e50 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
23e60 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
23e70 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
23e80 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
23e90 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
23ea0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
23eb0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23ec0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
23ed0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
23ee0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
23ef0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
23f00 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
23f10 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
23f20 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
23f30 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
23f40 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
23f50 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
23f60 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
23f70 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
23f80 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
23f90 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
23fa0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
23fb0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
23fc0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
23fd0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
23fe0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
23ff0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
24000 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
24010 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
24020 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
24030 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
24040 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
24050 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24060 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
24070 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
24080 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
24090 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
240a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
240b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
240c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
240d0 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
240e0 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
240f0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
24100 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
24110 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24120 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
24130 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
24140 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
24150 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
24160 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
24170 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
24180 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
24190 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
241a0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
241b0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
241c0 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
241d0 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
241e0 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
241f0 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
24200 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
24210 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
24220 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
24230 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24240 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24250 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24260 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
24270 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24280 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
24290 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
242a0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
242b0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
242c0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
242d0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
242e0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
242f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24300 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
24310 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
24320 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24330 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
24340 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24350 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
24360 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24370 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24380 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
24390 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
243a0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
243b0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
243c0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
243d0 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
243e0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
243f0 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
24400 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
24410 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
24420 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
24430 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
24440 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
24450 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
24460 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
24470 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
24480 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
24490 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
244a0 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
244b0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
244c0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
244d0 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
244e0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
244f0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
24500 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
24510 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
24520 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
24530 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
24540 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
24550 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
24560 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
24570 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
24580 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
24590 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
245a0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
245b0 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
245c0 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
245d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
245e0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
245f0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
24600 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
24610 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
24620 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
24630 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
24640 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
24650 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
24660 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
24670 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24680 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
24690 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
246a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
246b0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
246c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
246d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
246e0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
246f0 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
24700 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
24710 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
24720 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
24730 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
24740 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
24750 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
24760 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
24770 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
24780 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
24790 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
247a0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
247b0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
247c0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
247d0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
247e0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
247f0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
24800 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
24810 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
24820 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
24830 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
24840 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24850 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
24860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24870 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24880 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
24890 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
248a0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
248b0 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
248c0 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
248d0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
248e0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
248f0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
24900 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
24910 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
24920 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
24930 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
24940 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
24950 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
24960 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
24970 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24980 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
24990 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
249a0 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
249b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
249c0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
249d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
249e0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
249f0 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
24a00 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
24a10 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
24a20 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
24a30 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
24a40 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
24a50 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
24a60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
24a70 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
24a80 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
24a90 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
24aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24ab0 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
24ac0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
24ad0 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
24ae0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
24af0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
24b00 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
24b10 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
24b20 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
24b30 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
24b40 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
24b50 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
24b60 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
24b70 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
24b80 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
24b90 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
24ba0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
24bb0 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
24bc0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
24bd0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
24be0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
24bf0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
24c00 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
24c10 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
24c20 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
24c30 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
24c40 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
24c50 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
24c60 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
24c70 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
24c80 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
24c90 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
24ca0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
24cb0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
24cc0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24cf0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
24d00 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
24d10 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
24d20 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
24d30 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
24d40 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
24d50 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
24d60 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
24d70 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
24d80 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
24d90 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
24da0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
24db0 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
24dc0 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
24dd0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
24de0 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
24df0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
24e00 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
24e10 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
24e20 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
24e30 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
24e40 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
24e50 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
24e60 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
24e70 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
24e80 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
24e90 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
24ea0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
24eb0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
24ec0 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
24ed0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
24ee0 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
24ef0 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
24f00 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
24f10 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
24f20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
24f30 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
24f40 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
24f50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
24f60 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
24f70 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
24f80 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
24f90 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
24fa0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
24fb0 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
24fc0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
24fd0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
24fe0 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
24ff0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
25000 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
25010 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
25020 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
25030 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
25040 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
25050 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
25060 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
25070 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
25080 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
25090 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
250a0 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
250b0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
250c0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
250d0 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
250e0 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
250f0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
25100 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
25110 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
25120 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
25130 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
25140 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
25150 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
25160 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
25170 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
25180 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
25190 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
251a0 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
251b0 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
251c0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
251d0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
251e0 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
251f0 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
25200 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
25210 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
25220 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
25230 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  or would be to r
25240 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
25250 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
25260 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
25270 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
25280 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
25290 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
252a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
252b0 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
252c0 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
252d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
252e0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
252f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
25300 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
25310 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
25320 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
25330 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
25340 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
25350 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
25360 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
25370 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
25380 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
25390 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
253a0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
253b0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
253c0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
253d0 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
253e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
253f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
25400 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
25410 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
25420 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
25430 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
25440 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
25450 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25460 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25470 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
25480 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
25490 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
254a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
254b0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
254c0 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
254d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
254e0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
254f0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
25500 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
25510 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
25520 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
25530 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
25540 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
25550 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
25560 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
25570 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
25580 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
25590 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
255a0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
255b0 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
255c0 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
255d0 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
255e0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
255f0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
25600 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
25610 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
25620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25630 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68  only called righ
25640 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
25650 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
25660 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  n..** Once this 
25670 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
25680 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72  n called, the tr
25690 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65  ansaction must e
256a0 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c  ither be.** roll
256b0 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ed back or commi
256c0 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20  tted. It is not 
256d0 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  safe to call thi
256e0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a  s function and.*
256f0 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  * then continue 
25700 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
25710 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
25720 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
25730 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
25740 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
25750 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
25760 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
25770 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
25780 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25790 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
257a0 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
257b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
257c0 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20  nPage;..  /* At 
257d0 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f  one point the co
257e0 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61  de here called a
257f0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25800 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a  straint() to.  *
25810 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c  * ensure that al
25820 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72  l pages being tr
25830 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20  uncated away by 
25840 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61  this operation a
25850 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  re,.  ** if one 
25860 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
25870 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65  ts are open, pre
25880 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65  sent in the save
25890 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72  point .  ** jour
258a0 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79  nal so that they
258b0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
258c0 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   if the savepoin
258d0 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  t is rolled.  **
258e0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e   back. This is n
258f0 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61  o longer necessa
25900 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  ry as this funct
25910 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a  ion is now only.
25920 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68    ** called righ
25930 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
25940 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
25950 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74  n. So although t
25960 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f  he .  ** Pager o
25970 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20  bject may still 
25980 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  have open savepo
25990 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76  ints (Pager.nSav
259a0 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a  epoint!=0), .  *
259b0 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65  * they cannot be
259c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f   rolled back. So
259d0 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63   the assertTrunc
259e0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
259f0 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  call.  ** is no 
25a00 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20  longer correct. 
25a10 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.}.../*.** Thi
25a20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25a30 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
25a40 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
25a50 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
25a60 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
25a70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
25a80 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
25a90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
25aa0 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
25ab0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
25ac0 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
25ad0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
25ae0 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
25af0 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
25b00 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
25b10 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
25b20 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
25b30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
25b40 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
25b50 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
25b60 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
25b70 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
25b80 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
25b90 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
25ba0 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
25bb0 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
25bc0 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
25bd0 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
25be0 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
25bf0 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
25c00 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
25c10 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
25c20 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
25c30 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
25c40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25c50 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
25c60 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
25c70 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
25c80 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
25c90 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
25ca0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
25cb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25cc0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
25cd0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
25ce0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
25cf0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
25d00 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
25d10 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
25d20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
25d40 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
25d50 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
25d60 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
25d70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25d80 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
25d90 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d  reference to a m
25da0 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
25db0 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67  e object for pag
25dc0 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a  e number pgno. .
25dd0 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
25de0 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70  t will use the p
25df0 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62  ointer pData, ob
25e00 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74  tained from xFet
25e10 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63  ch()..** If succ
25e20 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50  essful, set *ppP
25e30 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  age to point to 
25e40 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66  the new page ref
25e50 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65  erence.** and re
25e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
25e70 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
25e80 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
25e90 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a  r code and set.*
25ea0 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72  * *ppPage to zer
25eb0 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65  o..**.** Page re
25ec0 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65  ferences obtaine
25ed0 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  d by calling thi
25ee0 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
25ef0 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a  d be released.**
25f00 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65   by calling page
25f10 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
25f20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
25f30 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
25f40 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  Page(.  Pager *p
25f50 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
25f60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
25f70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e   object */.  Pgn
25f80 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25fa0 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Page number */. 
25fb0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fd0 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64   /* xFetch()'d d
25fe0 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67  ata for this pag
25ff0 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70  e */.  PgHdr **p
26000 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  pPage           
26010 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
26020 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a  cquired page obj
26030 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  ect */.){.  PgHd
26040 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
26050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
26060 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26070 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
26080 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d    if( pPager->pM
26090 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  mapFreelist ){. 
260a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
260b0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
260c0 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67  eelist;.    pPag
260d0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
260e0 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
260f0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
26100 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
26110 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65  pExtra, 0, pPage
26120 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  r->nExtra);.  }e
26130 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
26140 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29   = p = (PgHdr *)
26150 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26160 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20  o(sizeof(PgHdr) 
26170 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
26180 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
26190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
261a0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
261b0 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
261c0 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
261d0 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
261e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
261f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
26200 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d  .    p->pExtra =
26210 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a   (void *)&p[1];.
26220 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50      p->flags = P
26230 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70  GHDR_MMAP;.    p
26240 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
26250 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  p->pPager = pPag
26260 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  er;.  }..  asser
26270 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76  t( p->pExtra==(v
26280 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20  oid *)&p[1] );. 
26290 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
262a0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
262b0 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44  ( p->flags==PGHD
262c0 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65  R_MMAP );.  asse
262d0 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70  rt( p->pPager==p
262e0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
262f0 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  t( p->nRef==1 );
26300 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67  ..  p->pgno = pg
26310 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d  no;.  p->pData =
26320 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72   pData;.  pPager
26330 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20  ->nMmapOut++;.. 
26340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26350 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  K;.}../*.** Rele
26360 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
26370 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50 67  to page pPg. pPg
26380 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
26390 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a  returned by an .
263a0 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  ** earlier call 
263b0 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  to pagerAcquireM
263c0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
263d0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
263e0 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48  leaseMapPage(PgH
263f0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
26400 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
26410 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65  >pPager;.  pPage
26420 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20  r->nMmapOut--;. 
26430 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
26440 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26450 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  list;.  pPager->
26460 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20  pMmapFreelist = 
26470 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
26480 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
26490 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  hods->iVersion>=
264a0 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  3 );.  sqlite3Os
264b0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
264c0 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70  fd, (i64)(pPg->p
264d0 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
264e0 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44  ageSize, pPg->pD
264f0 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ata);.}../*.** F
26500 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62  ree all PgHdr ob
26510 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20  jects stored in 
26520 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46  the Pager.pMmapF
26530 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f  reelist list..*/
26540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
26550 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50 61  erFreeMapHdrs(Pa
26560 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26570 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64  PgHdr *p;.  PgHd
26580 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  r *pNext;.  for(
26590 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  p=pPager->pMmapF
265a0 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e  reelist; p; p=pN
265b0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
265c0 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
265d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
265e0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
265f0 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
26600 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
26610 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
26620 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
26630 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
26640 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
26650 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
26660 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
26670 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
26680 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
26690 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
266a0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
266b0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
266c0 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
266d0 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
266e0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
266f0 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
26700 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
26710 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
26720 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
26730 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
26740 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
26750 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
26760 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
26770 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
26780 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
26790 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
267a0 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
267b0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
267c0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
267d0 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
267e0 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
267f0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
26800 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
26810 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
26820 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
26830 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
26840 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
26850 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
26860 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
26870 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
26880 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
26890 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73  e;..  assert( as
268a0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
268b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
268c0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
268d0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
268e0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
268f0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67  nMalloc();.  pag
26900 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50  erFreeMapHdrs(pP
26910 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ager);.  /* pPag
26920 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
26930 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   */.  pPager->ex
26940 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
26950 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26960 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74  OMIT_WAL.  sqlit
26970 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65  e3WalClose(pPage
26980 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d  r->pWal, pPager-
26990 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20  >ckptSyncFlags, 
269a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
269b0 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65  , pTmp);.  pPage
269c0 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e  r->pWal = 0;.#en
269d0 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65  dif.  pager_rese
269e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
269f0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
26a00 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
26a10 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
26a20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65   /* If it is ope
26a30 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n, sync the jour
26a40 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
26a50 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e  calling UnlockAn
26a60 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a  dRollback..    *
26a70 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
26a80 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75   done, then an u
26a90 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
26aa0 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
26ab0 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  nal .    ** file
26ac0 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62   may be played b
26ad0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
26ae0 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
26af0 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
26b00 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74   .    ** while t
26b10 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
26b20 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
26b30 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
26b40 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  upt..    **.    
26b50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
26b60 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
26b70 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a  ng to sync the j
26b80 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68  ournal, shift th
26b90 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69  e pager.    ** i
26ba0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
26bb0 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ate. This causes
26bc0 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
26bd0 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ck to unlock the
26be0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
26bf0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a   and close the j
26c00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68  ournal file with
26c10 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74  out attempting t
26c20 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a  o roll it.    **
26c30 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a   back or finaliz
26c40 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64  e it. The next d
26c50 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c  atabase user wil
26c60 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74  l have to do hot
26c70 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20  -journal.    ** 
26c80 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  rollback before 
26c90 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
26ca0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
26cb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70   */.    if( isOp
26cc0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26cd0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
26ce0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67  rror(pPager, pag
26cf0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
26d00 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
26d10 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
26d20 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
26d30 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
26d40 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
26d50 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
26d60 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
26d70 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
26d80 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
26d90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
26da0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
26db0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
26dc0 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
26dd0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
26de0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  fd);.  sqlite3Os
26df0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
26e00 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
26e10 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
26e20 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
26e30 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
26e40 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
26e50 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
26e60 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
26e70 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
26e80 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
26e90 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
26ea0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
26eb0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
26ec0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
26ed0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
26ee0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
26ef0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
26f00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
26f10 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
26f20 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
26f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26f40 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
26f50 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
26f60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
26f70 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
26f80 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
26f90 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
26fa0 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
26fb0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
26fc0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
26fd0 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
26fe0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
26ff0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
27000 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
27010 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
27020 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
27030 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
27040 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27050 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
27060 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
27070 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
27080 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
27090 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
270a0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
270b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
270c0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
270d0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
270e0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
270f0 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
27100 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
27110 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
27120 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
27130 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
27140 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
27150 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
27160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27170 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
27180 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
27190 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
271a0 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
271b0 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a  l-mode and the .
271c0 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ** device charac
271d0 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65  teristics of the
271e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
271f0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
27200 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
27210 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
27220 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
27230 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
27240 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
27250 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
27260 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
27270 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
27280 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
27290 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
272a0 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
272b0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
272c0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
272d0 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
272e0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
272f0 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
27300 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
27310 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
27320 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
27330 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
27340 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
27350 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
27360 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
27370 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
27380 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
27390 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
273a0 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
273b0 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
273c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
273d0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
273e0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
273f0 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
27400 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
27410 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
27420 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
27430 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
27440 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
27450 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
27460 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
27470 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
27480 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
27490 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
274a0 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
274b0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
274c0 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
274d0 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
274e0 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
274f0 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
27500 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
27510 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
27520 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
27530 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
27540 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
27550 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
27560 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
27570 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
27580 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
27590 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
275a0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
275b0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
275c0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
275d0 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
275e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
275f0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
27600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
27610 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
27620 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
27630 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27650 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27660 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
27670 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
27680 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
27690 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
276a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
276b0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
276c0 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
276d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
276e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
276f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
27700 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
27710 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
27720 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
27730 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
27740 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27750 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27760 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
27770 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
27780 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
27790 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
277a0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
277b0 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
277c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
277d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
277e0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
277f0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
27800 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
27810 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
27820 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
27830 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
27840 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27850 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
27860 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
27870 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
27880 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
27890 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
278a0 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
278b0 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
278c0 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
278d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
278e0 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
278f0 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
27900 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
27910 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
27920 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
27930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27940 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
27950 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
27960 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
27970 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
27980 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
27990 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
279a0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
279b0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
279c0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
279d0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
279e0 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
279f0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
27a00 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
27a10 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
27a20 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
27a30 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
27a40 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
27a50 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
27a60 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
27a70 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
27a80 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
27a90 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
27aa0 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
27ab0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
27ac0 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
27ad0 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
27ae0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
27af0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
27b00 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
27b10 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
27b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
27b30 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
27b40 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
27b50 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
27b60 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
27b70 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
27b80 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
27b90 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
27ba0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
27bb0 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
27bc0 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
27bd0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
27be0 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
27bf0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
27c00 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
27c10 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
27c20 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
27c30 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
27c40 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
27c50 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
27c60 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
27c70 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
27c80 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
27c90 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
27ca0 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
27cb0 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
27cc0 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
27cd0 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
27ce0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
27cf0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
27d00 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
27d10 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
27d20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
27d30 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
27d40 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
27d50 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
27d60 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
27d70 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
27d80 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
27d90 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
27da0 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
27db0 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
27dc0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
27dd0 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
27de0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
27df0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
27e00 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
27e10 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
27e20 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
27e30 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
27e40 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
27e50 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
27e60 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
27e70 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
27e80 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
27e90 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
27ea0 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
27eb0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
27ec0 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
27ed0 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
27ee0 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
27ef0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
27f00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
27f10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
27f20 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
27f30 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
27f40 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
27f50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27f60 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
27f70 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
27f80 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
27f90 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
27fa0 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
27fb0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
27fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27fd0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
27fe0 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
27ff0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
28000 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28010 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28020 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
28030 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
28040 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
28050 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28060 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28070 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
28080 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
28090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
280a0 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
280b0 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
280c0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
280d0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
280e0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
280f0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
28100 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
28110 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
28120 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
28130 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
28140 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
28150 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
28160 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
28170 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28180 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
28190 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
281a0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
281b0 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
281c0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
281d0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
281e0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
281f0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
28200 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
28210 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
28220 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
28230 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
28240 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
28250 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
28260 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
28270 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
28280 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
28290 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
282a0 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
282b0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
282c0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
282d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
282e0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
282f0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
28300 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
28310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
28320 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
28330 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
28340 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28350 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
28360 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
28370 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
28380 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28390 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
283a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
283b0 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
283c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
283d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
283e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
283f0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28400 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
28410 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
28420 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
28430 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28440 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
28450 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
28460 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
28470 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
28480 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28490 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
284a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
284b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
284c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
284d0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
284e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
284f0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
28500 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28510 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
28520 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28530 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
28540 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
28550 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
28560 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
28570 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28580 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28590 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
285a0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
285b0 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
285c0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
285d0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
285e0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
285f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28600 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28610 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
28620 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
28630 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
28640 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
28650 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
28660 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
28670 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
28680 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
28690 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
286a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
286b0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
286c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
286d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
286e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
286f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28700 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
28710 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
28720 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
28730 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28740 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
28750 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
28760 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
28770 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
28780 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
28790 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
287a0 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
287b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
287c0 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
287d0 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
287e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
287f0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
28800 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
28810 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
28820 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
28830 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
28840 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
28850 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
28860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
28880 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
28890 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
288a0 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
288b0 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
288c0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
288d0 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
288e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
288f0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
28900 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
28910 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
28920 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
28930 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
28940 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
28950 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
28960 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
28970 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
28980 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
28990 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
289a0 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
289b0 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
289c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
289d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
289e0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
289f0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
28a00 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
28a10 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
28a20 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
28a30 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
28a40 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
28a50 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
28a60 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
28a70 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
28a80 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
28a90 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
28aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28ab0 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
28ac0 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
28ad0 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
28ae0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
28af0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
28b00 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
28b10 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
28b20 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
28b30 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
28b40 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
28b50 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
28b60 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
28b70 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
28b80 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
28b90 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
28ba0 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
28bb0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
28bc0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
28bd0 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
28be0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
28bf0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
28c00 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
28c10 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
28c20 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
28c30 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
28c40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
28c50 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
28c60 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
28c70 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
28c80 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
28c90 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
28ca0 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
28cb0 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
28cc0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
28cd0 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
28ce0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
28cf0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
28d00 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
28d10 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
28d20 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
28d30 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
28d40 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
28d50 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
28d60 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
28d70 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
28d80 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
28d90 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
28da0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
28db0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
28dc0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
28dd0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
28de0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
28df0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
28e00 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
28e10 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
28e20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
28e30 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
28e40 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
28e50 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
28e60 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
28e70 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
28e80 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
28e90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28eb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
28ec0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
28ed0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
28ee0 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
28ef0 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
28f00 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
28f10 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
28f20 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
28f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28f40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
28f50 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
28f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28f70 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
28f80 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
28f90 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
28fa0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
28fb0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
28fc0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
28fd0 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
28fe0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
28ff0 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
29000 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
29010 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
29020 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
29030 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
29040 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
29050 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
29060 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
29070 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
29080 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
29090 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
290a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
290b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
290c0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
290d0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
290e0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
290f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
29100 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74  e the first writ
29110 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20  e, give the VFS 
29120 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74  a hint of what t
29130 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69  he final.  ** fi
29140 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e  le size will be.
29150 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
29170 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
29180 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  fd) );.  if( rc=
29190 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26  =SQLITE_OK .   &
291a0 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  & pPager->dbHint
291b0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
291c0 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74  ize.   && (pList
291d0 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73  ->pDirty || pLis
291e0 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  t->pgno>pPager->
291f0 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b  dbHintSize).  ){
29200 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
29210 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67  64 szFile = pPag
29220 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  er->pageSize * (
29230 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50  sqlite3_int64)pP
29240 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
29250 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
29260 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
29270 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
29280 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
29290 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61  szFile);.    pPa
292a0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
292b0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
292c0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
292d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
292e0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
292f0 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
29300 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
29310 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
29320 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
29330 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
29340 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
29350 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
29360 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
29370 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
29380 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
29390 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
293a0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
293b0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
293c0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
293d0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
293e0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
293f0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
29400 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
29410 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29420 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
29430 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
29440 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
29450 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
29460 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
29470 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
29480 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
29490 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
294a0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
294b0 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
294c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
294d0 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
294e0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
294f0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
29500 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
29510 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77    /* Offset to w
29520 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68  rite */.      ch
29530 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ar *pData;      
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29560 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f  Data to write */
29570 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65      ..      asse
29580 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67  rt( (pList->flag
29590 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
295a0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  C)==0 );.      i
295b0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
295c0 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
295d0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
295e0 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ist);..      /* 
295f0 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62  Encode the datab
29600 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44  ase */.      COD
29610 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73  EC2(pPager, pLis
29620 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  t->pData, pgno, 
29630 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  6, return SQLITE
29640 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a  _NOMEM, pData);.
29650 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
29660 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
29670 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
29680 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
29690 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
296a0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
296b0 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
296c0 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
296d0 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
296e0 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
296f0 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
29700 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
29710 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
29720 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
29730 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
29740 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
29750 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
29760 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29770 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
29780 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
29790 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
297a0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
297b0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
297c0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
297d0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
297e0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
297f0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
29800 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
29810 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
29820 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
29830 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
29840 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
29850 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
29860 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
29870 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
29880 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
29890 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
298a0 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
298b0 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
298c0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
298d0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
298e0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
298f0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
29900 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
29910 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
29920 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
29930 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29950 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29960 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
29970 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
29980 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
29990 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
299a0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
299b0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
299c0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
299d0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
299e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
299f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
29a00 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
29a10 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
29a20 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
29a30 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
29a40 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
29a50 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
29a60 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
29a70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
29a80 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
29a90 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
29aa0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
29ab0 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
29ac0 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
29ad0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
29ae0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
29af0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29b00 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
29b10 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
29b20 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
29b30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
29b40 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
29b50 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
29b60 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
29b70 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
29b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
29b90 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
29ba0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29bb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29bc0 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
29bd0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
29be0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
29bf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
29c00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29c10 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
29c20 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
29c30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29c40 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
29c50 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
29c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29c70 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
29c80 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
29c90 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f  r->sjfd, SQLITE_
29ca0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
29cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
29cc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29cd0 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
29ce0 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
29cf0 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
29d00 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
29d10 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73  urnal. .** It is
29d20 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
29d30 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75  ponsibility to u
29d40 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  se subjRequiresP
29d50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a  age() to check .
29d60 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65  ** that it is re
29d70 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65  ally required be
29d80 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
29d90 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
29da0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
29db0 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
29dc0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
29dd0 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
29de0 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
29df0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
29e00 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
29e10 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
29e20 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
29e30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
29e40 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
29e50 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
29e60 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
29e70 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
29e80 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
29e90 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
29ea0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
29eb0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
29ec0 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
29ed0 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
29ee0 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
29ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
29f00 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
29f10 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
29f20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29f30 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
29f40 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
29f50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
29f60 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
29f70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
29f80 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
29f90 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
29fa0 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
29fb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
29fc0 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
29fd0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
29fe0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
29ff0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a000 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2a010 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2a030 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a040 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2a050 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2a060 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2a070 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2a080 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2a090 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20  Journal(pPg) .  
2a0a0 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70         || pPg->p
2a0b0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
2a0c0 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20  igSize .    );. 
2a0d0 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
2a0e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2a0f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2a100 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f  ub-journal was o
2a110 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  pened successful
2a120 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61  ly (or was alrea
2a130 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a  dy open),.    **
2a140 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e   write the journ
2a150 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  al record into t
2a160 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  he file.  */.   
2a170 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a180 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  OK ){.      void
2a190 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
2a1a0 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20  Data;.      i64 
2a1b0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50  offset = (i64)pP
2a1c0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34  ager->nSubRec*(4
2a1d0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
2a1e0 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e);.      char *
2a1f0 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20  pData2;.  .     
2a200 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2a210 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
2a220 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
2a230 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
2a240 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  );.      PAGERTR
2a250 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
2a260 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
2a270 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2a280 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2a290 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
2a2a0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
2a2b0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
2a2c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2a2d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a2f0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2a300 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
2a310 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
2a320 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
2a330 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a340 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2a350 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a360 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
2a370 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
2a380 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2a390 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
2a3a0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
2a3b0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
2a3c0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
2a3d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a3e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a3f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
2a400 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20  he pcache layer 
2a410 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63  when it has reac
2a420 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74  hed some.** soft
2a430 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54   memory limit. T
2a440 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
2a450 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
2a460 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74  o a Pager object
2a470 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76  .** (cast as a v
2a480 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72  oid*). The pager
2a490 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67   is always 'purg
2a4a0 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69  eable' (not an i
2a4b0 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61  n-memory.** data
2a4c0 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e  base). The secon
2a4d0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
2a4e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70  reference to a p
2a4f0 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20  age that is .** 
2a500 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
2a510 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  but has no outst
2a520 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
2a530 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69  s. The page.** i
2a540 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61  s always associa
2a550 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67  ted with the Pag
2a560 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
2a570 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a   as the first .*
2a580 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
2a590 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
2a5a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f  s function is to
2a5b0 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20   make pPg clean 
2a5c0 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63  by writing its c
2a5d0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74  ontents.** out t
2a5e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2a5f0 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ile, if possible
2a600 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c  . This may invol
2a610 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a  ve syncing the.*
2a620 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
2a630 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2a640 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61  sful, sqlite3Pca
2a650 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2a660 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
2a670 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  page and.** SQLI
2a680 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2a690 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2a6a0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2a6b0 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ng to make the.*
2a6c0 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68  * page clean, th
2a6d0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
2a6e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2a6f0 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  the page cannot 
2a700 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e  be.** made clean
2a710 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
2a720 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65  reason, but no e
2a730 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2a740 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
2a750 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  s returned by sq
2a760 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2a770 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  lean() is not ca
2a780 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
2a790 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
2a7a0 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a  void *p, PgHdr *
2a7b0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
2a7c0 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
2a7d0 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  )p;.  int rc = S
2a7e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2a7f0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
2a800 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
2a810 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
2a820 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
2a830 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  /* The doNotS
2a840 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73  yncSpill flag is
2a850 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65   set during time
2a860 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73  s when doing a s
2a870 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72  ync of.  ** jour
2a880 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20  nal (and adding 
2a890 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73  a new header) is
2a8a0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54   not allowed.  T
2a8b0 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  his occurs.  ** 
2a8c0 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20  during calls to 
2a8d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a8e0 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67  e() while trying
2a8f0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74   to journal mult
2a900 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  iple.  ** pages 
2a910 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
2a920 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20   same sector..  
2a930 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f  **.  ** The doNo
2a940 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69  tSpill flag inhi
2a950 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2a960 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65  pilling regardle
2a970 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20  ss of whether.  
2a980 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  ** or not a sync
2a990 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2a9a0 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2a9b0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  g a rollback..  
2a9c0 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
2a9d0 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
2a9e0 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
2a9f0 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
2aa00 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
2aa10 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
2aa20 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
2aa30 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
2aa40 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20  mplementaton it 
2aa50 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69  .  ** is impossi
2aa60 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50  ble for sqlite3P
2aa70 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20  cacheFetch() to 
2aa80 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63  be called with c
2aa90 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a  reateFlag==1.  *
2aaa0 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65  * while in the e
2aab0 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63  rror state, henc
2aac0 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  e it is impossib
2aad0 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
2aae0 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63  ine to.  ** be c
2aaf0 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72  alled in the err
2ab00 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72  or state.  Never
2ab10 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c  theless, we incl
2ab20 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20  ude a NEVER().  
2ab30 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  ** test for the 
2ab40 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61  error state as a
2ab50 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e   safeguard again
2ab60 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  st future change
2ab70 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
2ab80 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2ab90 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ode) ) return SQ
2aba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
2abb0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2abc0 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  l ) return SQLIT
2abd0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2abe0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
2abf0 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  ll && (pPg->flag
2ac00 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
2ac10 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  YNC)!=0 ){.    r
2ac20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ac30 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69  .  }..  pPg->pDi
2ac40 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2ac50 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2ac60 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
2ac70 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
2ac80 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
2ac90 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
2aca0 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
2acb0 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20  resPage(pPg) ){ 
2acc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
2acd0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2ace0 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20   .    }.    if( 
2acf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ad00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2ad10 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
2ad20 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20  r, pPg, 0, 0);. 
2ad30 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2ad40 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2ad50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
2ad60 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2ad70 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
2ad80 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2ad90 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
2ada0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2adb0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
2adc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
2add0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2ade0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  ager, 1);.    }.
2adf0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
2ae00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2ae10 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72  this page is lar
2ae20 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
2ae30 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20  rent size of.   
2ae40 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2ae50 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
2ae60 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
2ae70 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
2ae80 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69  rnal..    ** Thi
2ae90 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
2aea0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
2aeb0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
2aec0 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
2aed0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77     ** actually w
2aee0 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
2aef0 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
2af00 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
2af10 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66  * Consider the f
2af20 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63  ollowing sequenc
2af30 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20  e of events:.   
2af40 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47   **.    **   BEG
2af50 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c  IN;.    **     <
2af60 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a  journal page X>.
2af70 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69      **     <modi
2af80 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  fy page X>.    *
2af90 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
2afa0 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sp;.    **      
2afb0 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
2afc0 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
2afd0 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s>.    **       
2afe0 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
2aff0 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52   X).    **     R
2b000 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
2b010 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2b020 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
2b030 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
2b040 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
2b050 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
2b060 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  n.    ** out to 
2b070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b080 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64  e, but will be d
2b090 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
2b0a0 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20  cache. Then,.   
2b0b0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
2b0c0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
2b0d0 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
2b0e0 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
2b0f0 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61  l read.    ** da
2b100 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
2b110 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
2b120 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
2b130 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
2b140 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  .    ** was when
2b150 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2b160 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
2b170 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
2b180 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20  VEPOINT sp".    
2b190 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
2b1a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2b1b0 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
2b1c0 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
2b1d0 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
2b1e0 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
2b1f0 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
2b200 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
2b210 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2b220 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
2b230 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  it will.    ** b
2b240 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
2b250 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
2b260 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
2b270 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20  CK TO sp" is .  
2b280 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
2b290 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
2b2a0 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d  VER(.        rc=
2b2b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2b2c0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
2b2d0 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65  dbSize && subjRe
2b2e0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
2b2f0 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72      ) ){.      r
2b300 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2b310 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
2b320 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
2b330 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b340 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
2b350 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b360 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
2b370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b380 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
2b390 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2b3a0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2b3b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2b3c0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
2b3d0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
2b3e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
2b3f0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
2b400 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
2b410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b420 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b430 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
2b440 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2b450 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2b460 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
2b470 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
2b480 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
2b490 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2b4a0 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
2b4b0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2b4c0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2b4d0 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
2b4e0 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
2b4f0 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
2b500 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
2b510 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
2b520 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
2b530 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
2b540 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
2b550 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
2b560 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
2b570 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
2b580 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b590 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
2b5a0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
2b5b0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
2b5c0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
2b5d0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
2b5e0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
2b5f0 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
2b600 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
2b610 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
2b620 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
2b630 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
2b640 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
2b650 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
2b660 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
2b670 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
2b680 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
2b690 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
2b6a0 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
2b6b0 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
2b6c0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
2b6d0 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
2b6e0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
2b6f0 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
2b700 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
2b710 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
2b720 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2b730 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
2b740 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
2b750 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
2b760 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
2b770 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2b780 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
2b790 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2b7a0 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
2b7b0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2b7c0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2b7d0 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2b7e0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2b7f0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2b800 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2b810 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2b820 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2b830 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2b840 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2b850 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2b860 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2b870 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2b880 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2b890 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2b8a0 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2b8b0 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2b8c0 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2b8d0 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2b8e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2b8f0 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2b900 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2b910 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2b920 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2b930 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2b940 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2b950 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2b960 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2b970 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2b980 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2b990 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2b9a0 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2b9b0 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2b9c0 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2b9d0 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2b9e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2b9f0 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2ba00 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2ba10 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2ba20 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2ba30 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2ba40 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2ba50 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2ba60 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2ba70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2ba80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2ba90 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2baa0 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2bab0 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2bac0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2bad0 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2bae0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2baf0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2bb00 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2bb10 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2bb20 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2bb30 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2bb40 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2bb50 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2bb60 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2bb70 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2bb80 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2bb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2bba0 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2bbb0 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2bbc0 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2bbd0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2bbe0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2bbf0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2bc00 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2bc10 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2bc20 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2bc30 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2bc40 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2bc50 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2bc60 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2bc70 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2bc80 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2bc90 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2bca0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2bcb0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2bcc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2bcd0 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2bce0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2bcf0 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2bd00 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2bd10 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2bd20 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2bd30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2bd40 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2bd50 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2bd60 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2bd70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2bd80 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2bd90 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2bda0 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2bdb0 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2bdc0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2bdd0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2bde0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2bdf0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2be00 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2be10 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2be20 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2be30 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2be40 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2be50 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2be60 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2be70 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2be80 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2be90 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2bea0 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2beb0 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2bec0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2bed0 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2bee0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2bef0 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2bf00 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2bf10 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2bf20 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2bf30 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2bf40 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2bf50 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2bf60 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2bf70 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2bf80 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2bf90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2bfa0 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2bfb0 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2bfc0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2bfd0 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2bfe0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2bff0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2c000 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2c010 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2c020 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2c030 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2c040 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
2c050 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
2c060 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
2c070 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
2c080 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
2c090 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
2c0a0 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
2c0b0 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
2c0c0 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
2c0d0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
2c0e0 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
2c0f0 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
2c100 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
2c110 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
2c120 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
2c130 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
2c140 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
2c150 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2c160 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
2c170 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
2c180 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
2c190 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
2c1a0 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2c1b0 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
2c1c0 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
2c1d0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2c1e0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2c1f0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2c200 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
2c210 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2c220 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c230 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2c240 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
2c250 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
2c260 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2c270 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2c280 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2c290 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2c2a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c2b0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2c2c0 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2c2d0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2c2e0 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mDb = 1;.    if(
2c2f0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c300 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2c310 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c320 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2c330 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  0, zFilename);. 
2c340 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61       if( zPathna
2c350 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20  me==0  ) return 
2c360 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c370 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2c380 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c390 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2c3a0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2c3b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2c3c0 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2c3d0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2c3e0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2c3f0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2c400 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2c410 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2c420 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2c430 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2c440 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2c450 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2c460 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2c470 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2c480 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2c490 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c4a0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2c4b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2c4c0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2c4d0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2c4e0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2c4f0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2c500 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2c510 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2c520 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2c530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2c540 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2c550 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b  }.    zPathname[
2c560 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
2c570 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
2c580 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
2c590 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
2c5a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c5b0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
2c5c0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2c5d0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
2c5e0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74  hname);.    nPat
2c5f0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2c600 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2c610 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69  e);.    z = zUri
2c620 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71   = &zFilename[sq
2c630 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
2c640 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20  ilename)+1];.   
2c650 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2c660 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2c670 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2c680 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2c690 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2c6a0 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d      }.    nUri =
2c6b0 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a   (int)(&z[1] - z
2c6c0 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Uri);.    assert
2c6d0 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20  ( nUri>=0 );.   
2c6e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c6f0 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
2c700 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
2c710 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
2c720 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2c730 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
2c740 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
2c750 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
2c760 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
2c770 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
2c780 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
2c790 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
2c7a0 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
2c7b0 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
2c7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
2c7d0 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
2c7e0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
2c7f0 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
2c800 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
2c810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2c820 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
2c830 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
2c840 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
2c850 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
2c860 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c870 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2c880 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c8a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2c8b0 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2c8c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2c8d0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2c8e0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2c8f0 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2c900 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2c910 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2c920 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2c930 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2c940 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2c950 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2c960 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2c970 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2c980 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2c990 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2c9a0 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2c9b0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2c9c0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2c9d0 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2c9e0 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2c9f0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2ca00 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2ca10 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2ca20 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2ca30 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2ca40 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2ca50 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2ca60 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2ca70 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2ca80 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2ca90 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2caa0 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2cab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2cac0 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2cad0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2cae0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2caf0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2cb10 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2cb20 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2cb30 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2cb40 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2cb50 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2cb60 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2cb70 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2cb80 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2cb90 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2cba0 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2cbb0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2cbc0 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2cbd0 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2cbe0 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2cbf0 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2cc00 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2cc10 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2cc20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2cc30 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2cc40 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2cc50 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2cc60 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2cc70 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2cc80 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2cc90 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2cca0 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2ccb0 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2ccc0 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2ccd0 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2cce0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2ccf0 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2cd00 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2cd10 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2cd20 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2cd30 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2cd40 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2cd50 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2cd60 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2cd70 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2cd80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2cd90 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2cda0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2cdb0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
2cdc0 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2cdd0 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2cde0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2cdf0 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2ce00 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2ce10 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2ce20 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2ce30 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2ce40 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2ce50 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2ce60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2ce70 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2ce80 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2ce90 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2cea0 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2ceb0 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2cec0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2ced0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2cee0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2cef0 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2cf00 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2cf10 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2cf20 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2cf30 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2cf40 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2cf50 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2cf60 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2cf70 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2cf80 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2cf90 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2cfa0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2cfb0 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2cfc0 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2cfd0 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2cfe0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2cff0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d000 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2d010 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d020 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2d030 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2d040 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2d050 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2d060 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2d070 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2d080 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d090 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2d0a0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d0b0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2d0c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2d0d0 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2d0e0 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2d0f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2d100 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2d110 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2d120 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2d130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d140 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2d150 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2d160 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d170 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2d180 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d190 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2d1a0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d1b0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2d1c0 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2d1d0 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2d1e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d1f0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d200 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d210 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2d220 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2d230 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2d240 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2d250 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2d260 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2d270 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2d280 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2d290 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2d2a0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2d2b0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2d2c0 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2d2d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d2e0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2d2f0 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2d300 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2d310 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2d320 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2d330 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d340 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2d350 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2d360 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2d370 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2d380 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2d390 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2d3a0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2d3b0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2d3c0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2d3d0 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2d3e0 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2d3f0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2d400 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2d410 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2d420 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2d430 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2d440 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2d450 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2d460 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2d470 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2d480 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2d490 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2d4a0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2d4b0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2d4c0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2d4d0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2d4e0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2d4f0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2d500 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2d510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d520 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
2d530 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2d540 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2d550 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2d560 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d570 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2d580 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
2d5a0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
2d5b0 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
2d5c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2d5d0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2d5e0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2d5f0 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2d600 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2d610 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2d620 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d630 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d640 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
2d650 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2d660 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2d670 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d680 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2d690 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2d6a0 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
2d6b0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2d6c0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2d6d0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2d6e0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2d6f0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2d700 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2d710 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2d720 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2d730 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2d740 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2d750 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2d760 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d770 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2d780 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2d790 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
2d7a0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2d7b0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2d7c0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2d7d0 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2d7e0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2d7f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2d800 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2d810 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2d820 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2d830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d840 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2d850 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
2d860 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
2d870 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
2d880 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
2d890 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
2d8a0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
2d8b0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
2d8c0 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
2d8d0 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
2d8e0 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
2d8f0 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
2d900 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
2d910 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
2d920 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
2d930 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2d940 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
2d950 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2d960 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
2d970 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
2d980 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
2d990 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
2d9a0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
2d9b0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
2d9c0 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
2d9d0 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
2d9e0 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
2d9f0 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
2da00 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2da10 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2da20 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2da30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f  .    pPager->eLo
2da40 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  ck = EXCLUSIVE_L
2da50 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  OCK;.    readOnl
2da60 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2da70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2da80 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2da90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2daa0 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2dab0 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2dac0 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2dad0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2dae0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2daf0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2db00 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2db10 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2db20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2db30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2db40 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2db50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2db60 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2db70 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2db80 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2db90 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2dba0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2dbb0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2dbc0 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
2dbd0 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
2dbe0 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2dbf0 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
2dc00 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2dc10 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2dc20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2dc30 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2dc40 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
2dc50 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
2dc60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2dc70 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2dc80 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2dc90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2dca0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2dcb0 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2dcc0 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
2dcd0 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
2dce0 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
2dcf0 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2dd00 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2dd10 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2dd20 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2dd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dd40 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2dd50 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2dd60 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2dd70 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
2dd80 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
2dd90 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
2dda0 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
2ddb0 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
2ddc0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
2ddd0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
2dde0 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
2ddf0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2de00 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
2de10 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
2de20 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70  eJournal;.  /* p
2de30 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
2de40 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2de50 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
2de60 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2de70 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
2de80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2de90 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
2dea0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2deb0 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
2dec0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
2ded0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2dee0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
2def0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
2df00 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
2df10 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
2df20 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20  LOCK; */.#if 0. 
2df30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2df40 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
2df50 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
2df60 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
2df70 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a  LOCK) );.#endif.
2df80 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2df90 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2dfa0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2dfb0 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2dfc0 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2dfd0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2dfe0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2dff0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2e000 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2e010 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2e020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2e030 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2e040 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2e050 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2e060 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2e070 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2e080 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2e090 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2e0a0 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2e0b0 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2e0c0 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2e0d0 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2e0e0 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2e0f0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2e100 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2e110 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2e120 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2e130 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50  mpFile;.  if( pP
2e140 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2e150 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e160 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20  er->fullSync==0 
2e170 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e180 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2e190 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e1a0 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t( pPager->walSy
2e1b0 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2e1c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e1d0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d  ->ckptSyncFlags=
2e1e0 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
2e1f0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
2e200 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
2e210 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
2e220 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2e230 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
2e240 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
2e250 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2e260 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52  AL | WAL_SYNC_TR
2e270 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20  ANSACTIONS;.    
2e280 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2e290 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2e2a0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
2e2b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2e2c0 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2e2d0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2e2e0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2e2f0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2e300 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e310 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2e320 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2e330 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2e340 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2e350 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2e360 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2e370 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2e380 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2e390 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2e3a0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2e3b0 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2e3c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2e3d0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2e3e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2e3f0 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2e400 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2e410 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2e420 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2e430 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2e440 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2e450 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2e460 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e470 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2e480 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e490 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2e4a0 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
2e4b0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2e4c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
2e4d0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
2e4e0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d    /* pPager->szM
2e4f0 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  map = SQLITE_DEF
2e500 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f  AULT_MMAP_SIZE /
2e510 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79  / will be set by
2e520 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a   btree.c */..  *
2e530 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2e540 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e550 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
2e560 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2e570 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2e580 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2e590 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2e5a0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2e5b0 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2e5c0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2e5d0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2e5e0 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2e5f0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2e600 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2e610 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2e620 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2e630 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2e640 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2e650 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2e660 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2e670 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2e680 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2e690 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2e6a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2e6b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2e6c0 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2e6d0 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2e6e0 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2e6f0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2e700 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2e710 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2e720 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2e730 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2e740 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2e750 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2e760 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2e770 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2e780 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2e790 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2e7a0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2e7b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2e7c0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2e7d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2e7e0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2e7f0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2e800 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2e810 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2e820 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2e830 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2e840 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2e850 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2e860 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2e870 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2e880 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2e890 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2e8a0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2e8b0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2e8c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2e8d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e8e0 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2e8f0 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2e900 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2e910 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2e920 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2e930 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2e940 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2e950 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2e960 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2e970 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2e980 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2e990 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2e9a0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2e9b0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2e9c0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2e9d0 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2e9e0 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2e9f0 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2ea00 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2ea10 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2ea20 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2ea30 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2ea40 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2ea50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2ea60 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2ea70 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2ea80 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2ea90 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2eaa0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2eab0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2eac0 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2ead0 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2eae0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2eaf0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2eb00 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2eb10 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2eb20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2eb30 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2eb40 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2eb50 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2eb60 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2eb70 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2eb80 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2eb90 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2eba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2ebb0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2ebc0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2ebd0 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2ebe0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2ebf0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2ec00 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2ec10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2ec20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2ec30 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2ec40 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2ec50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2ec60 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2ec70 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2ec80 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2ec90 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2eca0 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2ecb0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2ecc0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2ecd0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2ece0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2ecf0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2ed00 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2ed10 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2ed20 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2ed30 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2ed40 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2ed50 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2ed60 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2ed70 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2ed80 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2ed90 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2eda0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2edb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2edc0 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2edd0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2ede0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2edf0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2ee00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ee10 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2ee20 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2ee30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ee40 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2ee50 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2ee60 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2ee70 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2ee80 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2ee90 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2eea0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2eeb0 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2eec0 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2eed0 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2eee0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2eef0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2ef00 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2ef10 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2ef20 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2ef30 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2ef40 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2ef50 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2ef60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2ef70 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2ef80 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2ef90 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2efa0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2efb0 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2efc0 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2efd0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2efe0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2eff0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2f000 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2f010 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2f020 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2f030 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2f040 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2f050 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2f060 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2f070 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2f080 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2f090 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2f0a0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2f0b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f0c0 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2f0d0 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2f0e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f0f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2f100 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2f110 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2f120 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
2f130 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2f140 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
2f150 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
2f160 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
2f170 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2f180 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
2f190 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2f1a0 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
2f1b0 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
2f1c0 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
2f1d0 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
2f1e0 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
2f1f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
2f200 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
2f210 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
2f220 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
2f230 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
2f240 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
2f250 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2f260 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2f270 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2f280 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f2a0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2f2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2f2c0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
2f2d0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2f2e0 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
2f2f0 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
2f300 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
2f310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f320 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
2f330 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
2f340 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
2f350 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f360 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
2f370 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
2f380 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2f390 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2f3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f3b0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2f3c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2f3d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f3e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2f3f0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f400 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2f410 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2f420 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2f430 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2f440 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2f450 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2f460 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2f470 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2f480 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2f490 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2f4a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2f4b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2f4c0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2f4d0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2f4e0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2f4f0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2f500 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2f510 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2f520 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2f530 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f540 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2f550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2f560 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2f570 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2f580 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f590 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2f5a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f5b0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2f5c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2f5d0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2f5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f5f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2f600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f610 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2f620 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2f630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2f640 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2f650 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2f660 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2f670 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f680 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2f690 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2f6a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f6b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2f6c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2f6d0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2f6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f6f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2f700 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2f710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f720 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2f730 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2f740 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2f750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2f760 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2f770 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2f780 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2f790 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2f7a0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2f7b0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2f7c0 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2f7d0 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2f7e0 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2f7f0 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2f800 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2f810 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2f820 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2f830 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2f840 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2f850 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2f860 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2f870 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2f880 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2f890 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2f8a0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2f8b0 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2f8c0 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2f8d0 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2f8e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2f8f0 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2f900 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2f910 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2f920 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2f930 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2f940 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2f950 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2f960 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2f970 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2f980 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2f990 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2f9a0 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2f9b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2f9c0 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2f9d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2f9e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2f9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2fa00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2fa10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2fa20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2fa30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2fa40 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2fa50 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2fa60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2fa70 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2fa80 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2fa90 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2faa0 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2fab0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2fac0 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2fad0 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2fae0 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2faf0 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2fb00 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2fb10 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2fb20 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2fb30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2fb40 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2fb50 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2fb60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2fb70 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2fb80 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2fb90 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
2fba0 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
2fbb0 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
2fbc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fbd0 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
2fbe0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
2fbf0 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
2fc00 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
2fc10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fc20 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
2fc30 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
2fc40 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
2fc50 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
2fc60 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
2fc70 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
2fc80 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
2fc90 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
2fca0 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
2fcb0 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
2fcc0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
2fcd0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
2fce0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
2fcf0 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
2fd00 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
2fd10 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
2fd20 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
2fd30 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2fd40 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
2fd50 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
2fd60 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
2fd70 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
2fd80 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
2fd90 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2fda0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2fdb0 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
2fdc0 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
2fdd0 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
2fde0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2fdf0 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
2fe00 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
2fe10 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
2fe20 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
2fe30 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2fe40 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
2fe50 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
2fe60 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
2fe70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2fe80 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
2fe90 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
2fea0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
2feb0 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
2fec0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2fed0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2fee0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2fef0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2ff00 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2ff10 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
2ff20 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
2ff30 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
2ff40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
2ff50 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
2ff60 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
2ff70 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2ff80 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2ff90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2ffa0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
2ffb0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2ffc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ffd0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2ffe0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2fff0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
30000 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
30010 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
30020 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
30030 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
30040 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
30050 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
30060 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
30070 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
30080 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
30090 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
300a0 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
300b0 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
300c0 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
300d0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
300e0 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
300f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30100 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
30110 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30120 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
30130 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
30140 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
30150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30160 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30170 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
30180 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
30190 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
301a0 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
301b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
301c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
301d0 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
301e0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
301f0 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
30200 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30210 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
30220 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
30230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30240 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
30250 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
30260 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
30270 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
30280 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
30290 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
302a0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
302b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
302c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
302d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
302e0 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
302f0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
30300 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
30310 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
30320 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
30330 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
30340 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
30350 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
30360 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
30370 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
30380 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
30390 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
303a0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
303b0 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
303c0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
303d0 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
303e0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
303f0 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
30400 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
30410 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
30420 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
30440 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
30450 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
30460 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
30470 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
30480 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
30490 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
304a0 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
304b0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
304c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
304d0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
304e0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
304f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
30500 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
30510 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
30520 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
30530 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
30540 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
30550 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
30560 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
30570 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
30580 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
30590 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
305a0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
305b0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
305c0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
305d0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
305e0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
305f0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
30600 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
30610 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
30620 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
30630 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
30640 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
30650 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
30660 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
30670 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
30680 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
30690 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
306a0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
306b0 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
306c0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
306d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
306e0 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
306f0 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
30700 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
30710 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
30720 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
30730 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
30740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30750 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
30760 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
30770 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
30780 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
30790 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
307a0 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
307b0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
307c0 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
307d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
307e0 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
307f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30800 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
30810 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
30820 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30840 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30850 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
30860 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
30870 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
30880 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
30890 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
308a0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
308b0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
308c0 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
308d0 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
308e0 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
308f0 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
30900 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
30910 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
30920 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
30930 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
30940 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
30950 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
30960 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
30970 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
30980 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
30990 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
309a0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
309b0 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
309c0 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
309d0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
309e0 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
309f0 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
30a00 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
30a10 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
30a20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
30a30 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
30a40 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
30a50 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
30a60 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
30a70 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
30a80 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
30a90 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
30aa0 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
30ab0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
30ac0 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
30ad0 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
30ae0 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
30af0 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
30b00 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
30b10 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
30b20 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
30b30 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
30b40 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
30b50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
30b60 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
30b70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
30b80 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
30b90 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
30ba0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
30bb0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
30bc0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
30bd0 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
30be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30bf0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
30c00 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
30c10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30c20 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
30c30 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
30c40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30c50 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
30c60 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
30c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
30c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
30c90 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
30ca0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
30cb0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
30cc0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
30cd0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
30ce0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
30cf0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
30d00 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
30d10 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
30d20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30d30 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
30d40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
30d50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
30d60 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
30d70 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
30d80 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
30d90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
30da0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30dc0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
30dd0 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
30de0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
30df0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
30e00 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
30e10 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
30e20 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
30e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30e40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
30e50 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
30e60 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
30e70 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
30e80 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
30e90 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
30ea0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
30eb0 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
30ec0 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
30ed0 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
30ee0 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
30ef0 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
30f00 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
30f10 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
30f20 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
30f30 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
30f40 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
30f50 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
30f60 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
30f70 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
30f80 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
30f90 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
30fa0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
30fb0 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
30fc0 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
30fd0 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
30fe0 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
30ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
31000 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
31010 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
31020 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
31030 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
31040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
31050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
31060 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
31070 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
31080 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
31090 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
310a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
310b0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
310c0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
310d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
310e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
310f0 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
31100 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
31110 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
31120 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
31130 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
31140 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
31150 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
31160 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
31170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31180 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
31190 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
311a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
311b0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
311c0 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
311d0 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
311e0 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
311f0 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
31200 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
31210 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
31220 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
31230 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
31240 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
31250 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
31260 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
31270 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
31280 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
31290 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
312a0 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
312b0 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
312c0 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
312d0 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
312e0 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
312f0 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
31300 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
31310 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
31320 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31330 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
31340 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
31350 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
31360 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
31370 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
31380 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
31390 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
313a0 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
313b0 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
313c0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
313d0 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
313e0 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
313f0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
31400 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
31410 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
31420 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
31430 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
31440 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
31450 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
31460 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
31470 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
31480 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
31490 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
314a0 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
314b0 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
314c0 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
314d0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
314e0 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
314f0 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
31500 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
31510 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
31520 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
31530 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
31540 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
31550 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
31560 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
31570 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
31580 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
31590 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
315a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
315b0 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
315c0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
315d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
315e0 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
315f0 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
31600 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
31610 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
31620 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
31630 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
31640 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31650 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 70 50   && (.        pP
31660 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 0a 20  ager->pBackup . 
31670 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63      || sqlite3Pc
31680 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
31690 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
316a0 20 0a 20 20 20 20 20 7c 7c 20 55 53 45 46 45 54   .     || USEFET
316b0 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 20 29  CH(pPager).    )
316c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
316d0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
316e0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
316f0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
31700 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
31710 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
31720 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
31730 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
31740 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
31750 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
31760 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
31770 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
31780 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
31790 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
317a0 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
317b0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
317c0 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68  hanged, flush th
317d0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
317e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
317f0 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
31800 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64  nges is detected
31810 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
31820 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
31830 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
31840 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
31850 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
31860 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
31870 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
31880 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
31890 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
318a0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
318b0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
318c0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
318d0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
318e0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
318f0 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
31900 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
31910 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
31920 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
31930 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
31940 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
31950 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
31960 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
31970 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
31980 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
31990 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
319a0 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
319b0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
319c0 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
319d0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
319e0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
319f0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
31a00 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
31a10 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
31a20 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  s)];..      rc =
31a30 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
31a40 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
31a50 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
31a60 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20  goto failed;..  
31a70 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20      if( nPage>0 
31a80 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
31a90 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
31aa0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
31ab0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
31ac0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
31ad0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
31ae0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
31af0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
31b00 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
31b10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
31b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
31b30 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
31b40 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
31b50 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
31b60 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
31b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31b80 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
31b90 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
31ba0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
31bb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
31bc0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
31bd0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
31be0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
31bf0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
31c00 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
31c10 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  reset(pPager);..
31c20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70          /* Unmap
31c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31c40 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62  le. It is possib
31c50 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c  le that external
31c60 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20   processes.     
31c70 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74     ** may have t
31c80 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74  runcated the dat
31c90 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
31ca0 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20  hen extended it 
31cb0 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  back.        ** 
31cc0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
31cd0 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20  size while this 
31ce0 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20  process was not 
31cf0 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a  holding a lock..
31d00 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
31d10 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61  is case there ma
31d20 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e  y exist a Pager.
31d30 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61  pMap mapping tha
31d40 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20  t appears.      
31d50 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72    ** to be the r
31d60 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73  ight size but is
31d70 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61   not actually va
31d80 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a  lid. Avoid this.
31d90 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
31da0 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70  bility by unmapp
31db0 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e  ing the db here.
31dc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
31dd0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
31de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
31df0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
31e00 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
31e10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31e20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
31e30 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
31e40 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
31e50 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
31e60 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
31e70 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
31e80 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
31e90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
31ea0 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
31eb0 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
31ec0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
31ed0 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
31ee0 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
31ef0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
31f00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31f10 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
31f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
31f30 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
31f40 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
31f50 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
31f60 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
31f70 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
31f80 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
31f90 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
31fa0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
31fb0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
31fc0 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
31fd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
31fe0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
31ff0 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
32000 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
32010 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
32020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32030 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
32040 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
32050 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
32060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
32070 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32080 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
32090 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
320a0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
320b0 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  EADER;.  }.  ret
320c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
320d0 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
320e0 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
320f0 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
32100 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
32110 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
32120 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
32130 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
32140 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
32150 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
32160 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
32170 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
32180 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
32190 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
321a0 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
321b0 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
321c0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
321d0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
321e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
321f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
32200 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
32210 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32220 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
32230 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73  MmapOut==0 && (s
32240 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
32250 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
32260 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20  ache)==0) ){.   
32270 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
32280 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
32290 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  .  }.}../*.** Ac
322a0 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
322b0 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  e to page number
322c0 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70   pgno in pager p
322d0 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a  Pager (a page.**
322e0 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74   reference has t
322f0 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66  ype DbPage*). If
32300 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
32310 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
32320 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
32330 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
32340 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
32350 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
32360 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
32370 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
32380 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
32390 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69   the cache, it i
323a0 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
323b0 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77  Otherwise, a new
323c0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20   page object is 
323d0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
323e0 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
323f0 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74  a.** read from t
32400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32410 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  . In some cases,
32420 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   the pcache modu
32430 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65  le may.** choose
32440 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65   not to allocate
32450 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
32460 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65  ct and may reuse
32470 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
32480 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f  object with no o
32490 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
324a0 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ences..**.** The
324b0 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
324c0 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
324d0 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
324e0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68  ized to zeros th
324f0 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65  e .** first time
32500 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
32510 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
32520 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65  f the page reque
32530 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65  sted is .** alre
32540 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
32550 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
32560 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
32570 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a  hen the extra.**
32580 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73   data is left as
32590 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65   it was when the
325a0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73   page object was
325b0 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a   last used..**.*
325c0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
325d0 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c  e image is small
325e0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
325f0 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66  ested page or if
32600 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20   a .** non-zero 
32610 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20  value is passed 
32620 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  as the noContent
32630 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74   parameter and t
32640 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
32650 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
32660 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74  eady stored in t
32670 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e  he cache, then n
32680 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73  o .** actual dis
32690 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49  k read occurs. I
326a0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
326b0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
326c0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20  the .** page is 
326d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
326e0 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a  ll zeros. .**.**
326f0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
32700 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
32710 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
32720 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f  are about the co
32730 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
32740 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
32750 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
32760 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
32770 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
32780 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
32790 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
327a0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
327b0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
327c0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
327d0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
327e0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
327f0 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
32800 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
32810 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
32820 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
32830 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
32840 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
32850 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
32860 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
32870 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
32880 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
32890 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
328a0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
328b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
328c0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
328d0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
328e0 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
328f0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
32900 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
32910 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
32920 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
32930 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
32940 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
32950 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
32960 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
32970 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
32980 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
32990 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
329a0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
329b0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
329c0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
329d0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
329e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
329f0 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
32a00 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
32a10 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
32a20 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
32a30 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
32a40 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
32a50 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
32a60 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
32a70 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
32a80 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
32a90 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
32aa0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
32ab0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
32ac0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
32ad0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
32ae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
32af0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
32b00 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
32b10 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
32b20 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
32b30 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
32b40 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
32b50 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
32b60 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
32b70 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
32b80 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
32b90 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
32ba0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
32bb0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
32bc0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
32bd0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
32be0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
32bf0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
32c00 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
32c10 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
32c20 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
32c30 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
32c40 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
32c50 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
32c60 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
32c70 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
32c80 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
32c90 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
32ca0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
32cb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
32cc0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
32cd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
32ce0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
32cf0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
32d00 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
32d10 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
32d20 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
32d30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
32d40 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
32d50 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
32d60 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 41 43 51      /* PAGER_ACQ
32d70 55 49 52 45 5f 58 58 58 20 66 6c 61 67 73 20 2a  UIRE_XXX flags *
32d80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
32d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
32da0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
32db0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32dd0 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
32de0 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
32df0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43  .  const int noC
32e00 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20  ontent = (flags 
32e10 26 20 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f  & PAGER_ACQUIRE_
32e20 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f  NOCONTENT);..  /
32e30 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61 62  * It is acceptab
32e40 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61 64  le to use a read
32e50 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67  -only (mmap) pag
32e60 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65  e for any page e
32e70 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20  xcept.  ** page 
32e80 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  1 if there is no
32e90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
32ea0 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41  on open or the A
32eb0 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a  CQUIRE_READONLY.
32ec0 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70    ** flag was sp
32ed0 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 63  ecified by the c
32ee0 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f  aller. And so lo
32ef0 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73 20  ng as the db is 
32f00 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70  not a .  ** temp
32f10 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f  orary or in-memo
32f20 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  ry database.  */
32f30 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d  .  const int bMm
32f40 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31 20  apOk = (pgno!=1 
32f50 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61 67  && USEFETCH(pPag
32f60 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  er).   && (pPage
32f70 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32f80 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
32f90 73 20 26 20 50 41 47 45 52 5f 41 43 51 55 49 52  s & PAGER_ACQUIR
32fa0 45 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66  E_READONLY)).#if
32fb0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
32fc0 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65  ODEC.   && pPage
32fd0 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e  r->xCodec==0.#en
32fe0 64 69 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  dif.  );..  asse
32ff0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
33000 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
33010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
33020 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
33030 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
33040 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d  sert( noContent=
33050 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30  =0 || bMmapOk==0
33060 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d   );..  if( pgno=
33070 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
33080 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33090 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
330a0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
330b0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
330c0 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  te, return an er
330d0 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ror immediately.
330e0 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
330f0 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61  , request the pa
33100 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63  ge from the PCac
33110 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69  he layer. */.  i
33120 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
33130 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de!=SQLITE_OK ){
33140 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
33150 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
33160 73 65 7b 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d  se{..    if( bMm
33170 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65  apOk && pagerUse
33180 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
33190 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
331a0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
331b0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
331c0 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
331d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
331e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
331f0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
33200 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 46 72    }..    if( iFr
33210 61 6d 65 3d 3d 30 20 26 26 20 62 4d 6d 61 70 4f  ame==0 && bMmapO
33220 6b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  k ){.      void 
33230 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20  *pData = 0;..   
33240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
33250 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  sFetch(pPager->f
33260 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 69  d, .          (i
33270 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
33280 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
33290 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
332a0 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20 20 29  , &pData.      )
332b0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
332c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
332d0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ata ){.        i
332e0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
332f0 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  e>PAGER_READER )
33300 7b 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  {.          (voi
33310 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
33320 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
33330 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
33340 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pPg);.        }.
33350 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d          if( pPg=
33360 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
33370 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
33380 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c  eMapPage(pPager,
33390 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70   pgno, pData, &p
333a0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Pg);.        }el
333b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
333c0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
333d0 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
333e0 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  (pgno-1)*pPager-
333f0 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
33400 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33410 20 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a       if( pPg ){.
33420 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
33430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  );.          *pp
33450 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Page = pPg;.    
33460 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33470 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
33480 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
33490 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
334a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
334b0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
334c0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
334d0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   }..    rc = sql
334e0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
334f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
33500 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65   pgno, 1, ppPage
33510 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
33520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33530 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
33540 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
33550 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
33560 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
33570 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
33580 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
33590 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
335a0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
335b0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
335c0 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
335d0 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
335e0 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
335f0 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
33600 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
33610 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33620 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
33630 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
33640 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
33650 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
33660 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
33670 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70   || (*ppPage)->p
33680 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
33690 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  f( (*ppPage)->pP
336a0 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
336b0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
336c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
336d0 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
336e0 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
336f0 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
33700 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
33710 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
33720 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
33730 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
33740 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
33750 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
33760 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
33770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
33780 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
33790 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
337a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
337b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
337c0 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
337d0 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
337e0 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
337f0 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
33800 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
33810 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d  .  */..    pPg =
33820 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50   *ppPage;.    pP
33830 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
33840 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  er;..    /* The 
33850 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
33860 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
33870 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
33880 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20  PT if a page.   
33890 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
338a0 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
338b0 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b   the unused lock
338c0 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71  ing-page, is req
338d0 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
338e0 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
338f0 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
33900 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
33910 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
33920 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
33930 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
33940 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
33950 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
33960 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
33970 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
33980 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
33990 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
339a0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
339b0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
339c0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
339d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
339e0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
339f0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
33a00 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
33a10 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
33a20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
33a30 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
33a40 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
33a50 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
33a60 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
33a70 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
33a80 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
33a90 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
33aa0 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
33ab0 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
33ac0 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
33ad0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
33ae0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
33af0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
33b00 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
33b10 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
33b20 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
33b30 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
33b40 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
33b50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
33b60 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
33b70 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
33b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
33b90 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
33ba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
33bb0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
33bc0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
33bd0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
33be0 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
33bf0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
33c00 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
33c10 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
33c20 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
33c30 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
33c40 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
33c50 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
33c60 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
33c70 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
33c80 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
33c90 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
33ca0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
33cb0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
33cc0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
33cd0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
33ce0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
33cf0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
33d00 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
33d10 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
33d20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
33d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33d40 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
33d50 28 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61  (pPager) && bMma
33d60 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pOk==0 ){.      
33d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
33d80 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
33d90 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
33da0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  iFrame);.       
33db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33dc0 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
33dd0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
33de0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
33df0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
33e00 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
33e10 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
33e20 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
33e30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
33e40 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
33e50 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
33e60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33e70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
33e80 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
33e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33ea0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
33eb0 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
33ec0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33ed0 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
33ee0 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
33ef0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33f00 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
33f10 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
33f20 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
33f30 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
33f40 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
33f50 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
33f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33f70 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
33f80 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
33f90 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
33fa0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
33fb0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
33fc0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
33fd0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
33fe0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
33ff0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
34000 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
34010 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65  ache. .**.** See
34020 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
34030 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
34040 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
34050 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
34060 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
34070 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
34080 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
34090 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
340a0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
340b0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
340c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
340d0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
340e0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
340f0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
34100 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
34110 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
34120 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
34130 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
34140 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
34150 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
34160 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
34170 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
34180 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65  *pPg = 0;.  asse
34190 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
341a0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
341b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
341c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
341d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
341e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
341f0 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
34200 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
34210 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
34220 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34230 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
34240 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
34250 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
34260 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
34270 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
34280 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
34290 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
342a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
342b0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
342c0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
342d0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
342e0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
342f0 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
34300 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
34310 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
34320 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
34330 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
34340 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
34350 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
34360 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
34370 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
34380 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
34390 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
343a0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
343b0 65 72 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  er;.    if( pPg-
343c0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
343d0 4d 41 50 20 29 7b 0a 20 20 20 20 20 20 70 61 67  MAP ){.      pag
343e0 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
343f0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
34400 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
34410 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
34420 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
34430 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
34440 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
34450 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
34460 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
34470 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
34480 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
34490 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
344a0 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
344b0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
344c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
344d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
344e0 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
344f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34500 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
34510 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34520 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
34530 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
34540 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
34550 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
34560 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
34570 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
34580 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
34590 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
345a0 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
345b0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
345c0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
345d0 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
345e0 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
345f0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
34600 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
34610 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
34620 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
34630 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
34640 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
34650 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
34660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34670 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
34680 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
34690 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
346a0 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
346b0 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
346c0 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
346d0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
346e0 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
346f0 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
34700 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
34710 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
34720 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
34730 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
34740 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
34750 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
34760 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
34770 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
34780 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
34790 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
347a0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
347b0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
347c0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
347d0 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
347e0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
347f0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
34800 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
34810 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
34820 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
34830 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
34840 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
34850 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
34860 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
34870 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
34880 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
348a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
348b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
348c0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
348d0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
348e0 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
348f0 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
34900 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
34910 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34920 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
34930 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
34940 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
34950 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
34960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34970 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
34980 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
34990 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
349a0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
349b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
349c0 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
349d0 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
349e0 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
349f0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
34a00 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
34a10 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
34a20 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
34a30 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
34a40 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
34a50 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
34a60 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
34a70 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
34a80 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
34a90 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
34aa0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
34ab0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
34ac0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
34ad0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
34ae0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
34af0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
34b00 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
34b10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
34b20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
34b30 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
34b40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34b50 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
34b60 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
34b70 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
34b80 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
34b90 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
34ba0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
34bb0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
34bc0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
34bd0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
34be0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
34bf0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
34c00 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
34c10 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
34c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c30 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
34c40 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
34c50 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53  e */.          S
34c60 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
34c70 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
34c80 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
34c90 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
34ca0 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
34cb0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
34cc0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
34cd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
34ce0 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
34cf0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
34d00 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
34d10 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
34d20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
34d30 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
34d40 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  E.        rc = s
34d50 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
34d60 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  n(.            p
34d70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
34d80 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
34d90 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
34da0 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
34db0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23  ).        );.  #
34dc0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
34dd0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
34de0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
34df0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
34e00 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
34e10 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d    #endif.      }
34e20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
34e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
34e40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
34e50 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
34e60 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
34e70 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
34e80 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
34e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
34ea0 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
34eb0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
34ec0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
34ed0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
34ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34ef0 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
34f00 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
34f10 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
34f20 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
34f30 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
34f40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
34f50 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
34f60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
34f70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
34f80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
34f90 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
34fa0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
34fb0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
34fc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
34fd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34fe0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
34ff0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
35000 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
35010 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
35020 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
35030 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
35040 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35050 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
35060 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
35070 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
35080 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
35090 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
350a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
350b0 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
350c0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
350d0 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
350e0 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
350f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
35100 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
35110 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
35120 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
35130 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
35140 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
35150 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
35160 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
35170 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
35180 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
35190 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
351a0 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
351b0 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
351c0 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
351d0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
351e0 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
351f0 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
35200 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
35210 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
35220 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
35230 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
35240 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
35250 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
35260 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
35270 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
35280 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
35290 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
352a0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
352b0 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
352c0 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
352d0 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
352e0 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
352f0 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
35300 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
35310 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
35320 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
35330 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
35340 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
35350 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
35360 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
35370 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
35380 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
35390 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
353a0 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
353b0 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
353c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
353d0 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
353e0 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
353f0 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
35400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
35410 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
35420 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
35430 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
35440 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
35450 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
35460 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
35470 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61  ode ) return pPa
35480 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
35490 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
354a0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
354b0 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e  ADER && pPager->
354c0 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52  eState<PAGER_ERR
354d0 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OR );.  pPager->
354e0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
354f0 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
35500 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
35510 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35520 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a  AGER_READER) ){.
35530 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
35540 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
35550 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  0 );..    if( pa
35560 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
35570 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
35580 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
35590 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
355a0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
355b0 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
355c0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
355d0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
355e0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
355f0 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
35600 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
35610 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
35620 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
35630 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
35640 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
35650 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
35660 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35670 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
35680 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
35690 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
356a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
356b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
356c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
356d0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
356e0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
356f0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
35700 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
35710 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
35720 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
35730 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
35740 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
35750 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
35760 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
35770 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
35780 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
35790 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
357a0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
357b0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
357c0 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
357d0 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
357e0 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
357f0 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
35800 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
35810 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
35820 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
35830 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
35840 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
35850 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
35860 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
35870 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
35880 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
35890 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
358a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
358b0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
358c0 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
358d0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
358e0 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
358f0 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
35900 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
35910 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
35920 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
35930 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
35940 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
35950 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
35960 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
35970 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
35980 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
35990 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
359a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
359b0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
359c0 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
359d0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
359e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
359f0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
35a00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
35a10 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
35a20 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
35a30 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
35a40 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
35a50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35a60 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
35a70 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
35a80 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
35a90 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
35aa0 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
35ab0 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
35ac0 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
35ad0 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
35ae0 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
35af0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
35b00 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
35b10 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
35b20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
35b30 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
35b40 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
35b50 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
35b60 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
35b70 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
35b80 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
35b90 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
35ba0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
35bb0 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
35bc0 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
35bd0 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
35be0 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
35bf0 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
35c00 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
35c10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35c20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
35c30 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
35c40 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
35c50 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
35c60 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
35c70 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35c80 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
35c90 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
35ca0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
35cb0 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
35cc0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
35cd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
35ce0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
35cf0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
35d00 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
35d10 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35d20 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
35d30 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
35d40 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
35d50 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35d60 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
35d70 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
35d80 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
35d90 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
35da0 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
35db0 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
35dc0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
35dd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
35de0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
35df0 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
35e00 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
35e10 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
35e20 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
35e30 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
35e40 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
35e50 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
35e60 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
35e70 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
35e80 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
35e90 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
35ea0 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
35eb0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
35ec0 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
35ed0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
35ee0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
35ef0 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
35f00 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
35f10 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
35f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35f30 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
35f40 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
35f50 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
35f60 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
35f70 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
35f80 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
35f90 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
35fa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
35fb0 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
35fc0 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
35fd0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
35fe0 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
35ff0 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
36000 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
36010 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
36020 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
36030 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
36040 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
36050 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
36060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36070 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36080 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
36090 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
360a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
360b0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
360c0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
360d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
360e0 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
360f0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
36100 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
36110 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
36120 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  n error has been
36130 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65   previously dete
36140 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65  cted, report the
36150 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a   same error.  **
36160 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f   again. This sho
36170 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20  uld not happen, 
36180 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72  but the check pr
36190 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73  ovides robustnes
361a0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
361b0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
361c0 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
361d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
361e0 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
361f0 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
36200 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
36210 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
36220 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
36230 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
36240 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
36250 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
36260 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36270 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
36280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
36290 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  RM;..  CHECK_PAG
362a0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  E(pPg);..  /* Th
362b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
362c0 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65  eeds to be opene
362d0 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20  d. Higher level 
362e0 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c  routines have al
362f0 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69  ready.  ** obtai
36300 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  ned the necessar
36310 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e  y locks to begin
36320 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
36330 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a  action, but the.
36340 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
36350 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
36360 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65  yet be open. Ope
36370 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73  n it now if this
36380 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
36390 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
363a0 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  done before call
363b0 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
363c0 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20  eMakeDirty() on 
363d0 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20  the page. .  ** 
363e0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74  Otherwise, if it
363f0 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72   were done after
36400 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
36410 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
36420 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20  ), then.  ** an 
36430 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75  error might occu
36440 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  r and the pager 
36450 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20  would end up in 
36460 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
36470 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61  ate.  ** with pa
36480 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69  ges marked as di
36490 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  rty in the cache
364a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
364b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
364c0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
364d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
364e0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
364f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
36500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36510 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
36520 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36530 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
36540 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
36550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
36560 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
36570 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
36580 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
36590 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
365a0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
365b0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
365c0 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
365d0 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
365e0 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
365f0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
36600 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
36610 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
36620 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
36630 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
36640 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
36650 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
36660 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
36670 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
36680 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
36690 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
366a0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
366b0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
366c0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
366d0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
366e0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
366f0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
36700 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
36710 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
36720 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
36730 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
36740 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
36750 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
36760 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
36770 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
36780 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
36790 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
367a0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
367b0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
367c0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
367d0 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65  rigSize && isOpe
367e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
367f0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
36800 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
36810 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20  r *pData2;.     
36820 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50     i64 iOff = pP
36830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36840 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
36850 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
36860 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
36870 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
36880 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
36890 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
368a0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
368b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
368c0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
368d0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
368e0 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
368f0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
36900 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
36910 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
36920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
36940 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
36950 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
36960 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
36970 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
36980 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
36990 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
369a0 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
369b0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
369c0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
369d0 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ta2);..        /
369e0 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
369f0 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
36a00 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
36a10 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
36a20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
36a30 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
36a40 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
36a50 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
36a60 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
36a70 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
36a80 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
36a90 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
36aa0 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
36ab0 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
36ac0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
36ad0 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
36ae0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
36af0 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
36b00 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
36b10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
36b20 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
36b30 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
36b40 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
36b50 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
36b60 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
36b70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
36b80 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
36b90 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
36ba0 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ..        rc = w
36bb0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
36bc0 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
36bd0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
36be0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36bf0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
36c00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
36c10 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
36c20 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
36c30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
36c40 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20  ze, iOff+4);.   
36c50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36c60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
36c70 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
36c80 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
36c90 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
36ca0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
36cb0 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  4, cksum);.     
36cc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36cd0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
36ce0 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ;..        IOTRA
36cf0 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
36d00 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
36d10 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
36d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36d40 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
36d50 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
36d60 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
36d70 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
36d80 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
36d90 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
36da0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
36db0 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
36dc0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
36dd0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
36de0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
36df0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
36e00 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
36e10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
36e20 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
36e30 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
36e40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
36e50 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
36e60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
36e70 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
36e80 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
36e90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36ea0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
36eb0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
36ec0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
36ed0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
36ee0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
36ef0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
36f00 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
36f10 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
36f20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36f30 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
36f40 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
36f50 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
36f60 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
36f70 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
36f80 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
36f90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36fa0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
36fb0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
36fc0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
36fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
36ff0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
37000 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
37010 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
37020 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OD ){.          
37030 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
37040 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
37050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37060 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
37070 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
37080 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
37090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
370b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
370c0 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
370d0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
370e0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
370f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37100 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
37110 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
37120 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
37130 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
37140 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
37150 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
37160 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
37170 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
37180 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
37190 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
371a0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
371b0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
371c0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
371d0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
371e0 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
371f0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
37200 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
37210 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
37220 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
37230 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
37240 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
37250 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
37260 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
37270 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
37280 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
37290 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
372a0 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
372b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
372c0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
372d0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
372e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
372f0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
37300 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
37310 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
37320 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
37330 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
37340 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
37350 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
37360 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
37370 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
37380 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
37390 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
373a0 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
373b0 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
373c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
373d0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
373e0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
373f0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
37400 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
37410 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
37420 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
37430 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
37440 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
37450 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
37460 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
37470 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
37480 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
37490 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
374a0 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
374b0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
374c0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
374d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
374e0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
374f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
37500 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
37510 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
37520 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
37530 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
37540 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
37550 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
37560 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37570 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
37580 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
37590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
375a0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
375b0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
375c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
375d0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
375e0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
375f0 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
37600 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
37610 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72  eSize);..  asser
37620 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  t( (pPg->flags &
37630 20 50 47 48 44 52 5f 4d 4d 41 50 29 3d 3d 30 20   PGHDR_MMAP)==0 
37640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37650 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
37660 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
37680 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
37690 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
376a0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
376b0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
376c0 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ) );..  if( nPag
376d0 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
376e0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
376f0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
37700 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
37710 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
37720 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
37730 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
37740 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
37750 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
37760 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
37770 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
37780 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20  nt nPage = 0;   
37790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
377a0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
377b0 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
377c0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
377d0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
377e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
377f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
37800 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
37810 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
37820 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
37830 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
37840 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
37850 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69  the doNotSyncSpi
37860 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  ll flag to 1. Th
37870 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
37880 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20   cannot allow.  
37890 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68    ** a journal h
378a0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
378b0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
378c0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
378d0 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  by.    ** this f
378e0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
378f0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
37900 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
37910 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
37920 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20  yncSpill==0 );. 
37930 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
37940 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20  SyncSpill++;..  
37950 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
37960 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
37970 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
37980 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
37990 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
379a0 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
379b0 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
379c0 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
379d0 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
379e0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
379f0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
37a00 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
37a10 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
37a20 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
37a30 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
37a40 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
37a50 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d      nPageCount =
37a60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
37a70 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
37a80 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
37a90 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
37aa0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
37ab0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
37ac0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
37ad0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
37ae0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
37af0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
37b00 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
37b10 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
37b20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
37b30 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
37b40 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
37b50 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
37b60 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
37b70 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
37b80 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
37b90 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
37ba0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
37bb0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
37bc0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
37bd0 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
37be0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
37bf0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
37c00 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
37c10 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
37c20 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
37c30 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
37c40 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
37c50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
37c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37c70 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
37c80 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
37c90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
37ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37cb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
37cc0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
37cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
37ce0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
37cf0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
37d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
37d10 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
37d20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
37d40 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
37d50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
37d70 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
37d80 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
37d90 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
37da0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
37db0 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
37dc0 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
37dd0 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
37de0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
37df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
37e00 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
37e10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
37e20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48     /* If the PGH
37e30 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
37e40 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
37e50 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
37e60 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
37e70 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
37e80 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
37e90 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
37ea0 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
37eb0 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
37ec0 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
37ed0 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
37ee0 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
37ef0 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
37f00 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
37f10 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
37f20 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
37f30 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
37f40 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
37f50 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
37f60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
37f70 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
37f80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37f90 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20  _OK && needSync 
37fa0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
37fb0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
37fc0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
37fd0 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
37fe0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
37ff0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
38000 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
38010 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
38020 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
38030 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
38040 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
38050 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
38060 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
38070 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
38080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
38090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
380a0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
380b0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
380c0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
380d0 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l--;.  }else{.  
380e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
380f0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
38100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
38110 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
38120 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
38130 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
38140 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
38150 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
38160 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
38170 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
38180 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
38190 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
381a0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
381b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
381c0 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
381d0 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
381e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
381f0 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
38200 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66  .  return pPg->f
38210 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
38220 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
38230 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
38240 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
38250 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
38260 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
38270 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
38280 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
38290 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
382a0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
382b0 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
382c0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
382d0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
382e0 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
382f0 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
38300 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20  ** the page has 
38310 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20  been added as a 
38320 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65  leaf of the free
38330 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a  list and so its.
38340 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f  ** content no lo
38350 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a  nger matters..**
38360 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
38370 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
38380 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
38390 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
383a0 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
383b0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
383c0 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67   unused. The pag
383d0 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
383e0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
383f0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
38400 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
38410 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
38420 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
38430 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
38440 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  an quadruple the
38450 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
38460 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61  .** DELETE opera
38470 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tions..*/.void s
38480 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
38490 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
384a0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
384b0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
384c0 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
384d0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
384e0 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
384f0 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  point==0 ){.    
38500 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
38510 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
38520 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
38530 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
38540 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52  ger)));.    IOTR
38550 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
38560 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
38570 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50  g->pgno)).    pP
38580 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
38590 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 20 20  R_DONT_WRITE;.  
385a0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
385b0 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 7d  hash(pPg);.  }.}
385c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
385d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
385e0 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
385f0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
38600 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63  abase file .** c
38610 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73  hange-counter, s
38620 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74  tored as a 4-byt
38630 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
38640 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74  eger starting at
38650 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74   .** byte offset
38660 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
38670 20 66 69 6c 65 2e 20 20 54 68 65 20 73 65 63 6f   file.  The seco
38680 6e 64 61 72 79 20 63 68 61 6e 67 65 20 63 6f 75  ndary change cou
38690 6e 74 65 72 20 61 74 0a 2a 2a 20 39 32 20 69 73  nter at.** 92 is
386a0 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2c 20 61   also updated, a
386b0 73 20 69 73 20 74 68 65 20 53 51 4c 69 74 65 20  s is the SQLite 
386c0