/ Hex Artifact Content
Login

Artifact e75ccadfe01cf67e25a0abd5343cd84d7373dd71:


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 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
71b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
71c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
71d0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
71e0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
71f0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
7200: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
7210: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
7220: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
7230: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7240: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7250: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7260: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7270: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7290: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
72a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
72b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
72c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7300: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7310: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7320: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7330: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7340: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7350: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
7360: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
7370: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
7380: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
7390: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
73a0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
73b0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
73c0: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
73d0: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
73e0: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
73f0: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7400: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7410: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7420: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7430: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7440: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7450: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
7460: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
7470: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
7480: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
7490: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
74a0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
74b0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
74c0: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
74d0: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
74e0: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
74f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7500: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7510: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7520: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7530: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7550: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
7560: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
7570: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
7580: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
7590: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
75a0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
75b0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
75c0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
75d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
75e0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
75f0: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7600: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7610: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7620: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7630: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7640: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7650: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
7660: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20  doNotSyncSpill; 
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
7680: 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68  ot do a spill th
7690: 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c  at requires jrnl
76a0: 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75   sync */.  u8 su
76b0: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
76c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
76d0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
76e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
76f0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7710: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7720: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7730: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7740: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7750: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7760: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7770: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7780: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
77a0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
77b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
77c0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
77d0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
77e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
77f0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7800: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7810: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7830: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7840: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7880: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7890: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
78a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
78b0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
78c0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
78d0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
78e0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
78f0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7910: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7920: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7930: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7940: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7950: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7960: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7970: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7980: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7990: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
79a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
79b0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
79c0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
79d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79e0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
79f0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a00: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7a10: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7a20: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7a30: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a40: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7a50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7a60: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7a70: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7a80: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7a90: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7aa0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7ab0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7ac0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7ad0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7af0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7b00: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7b10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7b20: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7b30: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7b40: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7b50: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7b60: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7b70: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7b80: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7bb0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7bc0: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7bd0: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7be0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7bf0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7c00: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7c10: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7c20: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7c30: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7c40: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
7c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c90: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
7ca0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
7cb0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
7cc0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
7cd0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
7ce0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
7cf0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
7d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7d10: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
7d20: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
7d30: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
7d40: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7d50: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
7d60: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
7d70: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
7d80: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
7d90: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
7da0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
7db0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
7dc0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7de0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7df0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
7e00: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7e20: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
7e30: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
7e40: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
7e50: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
7e60: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
7e70: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
7e80: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
7e90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
7ea0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
7eb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7ec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7ed0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
7ee0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
7ef0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
7f00: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7f10: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
7f20: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
7f30: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
7f40: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
7f50: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
7f60: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
7f70: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
7f80: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
7f90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7fa0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
7fb0: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
7fc0: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
7fd0: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
7fe0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
7ff0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
8000: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
8010: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
8020: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8030: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8040: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8050: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8060: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8070: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8080: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8090: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
80a0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
80b0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
80c0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
80d0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
80e0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
80f0: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8100: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8110: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8120: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8130: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8150: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8160: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8170: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
81a0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
81b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
81c0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
81d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
81e0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
81f0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8200: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8210: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8220: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8230: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8240: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8260: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8280: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8290: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
82a0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
82b0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
82e0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
82f0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8300: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8310: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8320: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8330: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8340: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8350: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8360: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8370: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8380: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8390: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
83a0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
83b0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
83c0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
83d0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
83e0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
83f0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8400: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8410: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8420: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8430: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8460: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8470: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8490: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
84a0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
84b0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
84c0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
84d0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
84e0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
84f0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8500: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8510: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8520: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8530: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8540: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8550: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8560: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8570: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8580: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8590: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
85a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
85b0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
85c0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
85d0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
85e0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
85f0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8610: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8620: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8630: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8640: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8650: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8660: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8670: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8680: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8690: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
86b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
86c0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
86d0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
86e0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
86f0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8700: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8710: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8720: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8730: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8740: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8750: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8760: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8770: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8780: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8790: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
87a0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
87b0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
87c0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
87d0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
87e0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
87f0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8800: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8810: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8820: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8830: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8840: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8850: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8860: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8870: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8880: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8890: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
88a0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
88b0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
88c0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
88d0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
88e0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
88f0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
8900: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
8910: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
8920: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
8930: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
8940: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
8950: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8960: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8970: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8980: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8990: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
89a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
89b0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
89c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
89d0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
89e0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
89f0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8a00: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8a10: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8a20: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8a30: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8a40: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8a50: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8a60: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8a70: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8a80: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8a90: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8aa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8ab0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8ac0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8ae0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8af0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8b00: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8b10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8b20: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8b30: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8b40: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8b50: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8b60: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8b70: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8b80: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8b90: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8ba0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8bb0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8bc0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8bd0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8be0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8bf0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8c00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8c10: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8c20: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8c30: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8c40: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8c50: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8c60: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8c70: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8c80: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8c90: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8ca0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8cb0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8cc0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8ce0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8cf0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8d00: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8d10: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8d20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8d30: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8d40: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8d50: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8d60: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8d70: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8d80: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8d90: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8da0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8db0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8dc0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8dd0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8de0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8df0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8e00: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8e10: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8e20: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8e30: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8e40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8e50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8e60: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8e70: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8e80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8e90: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8ea0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8eb0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8ec0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8ed0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8ee0: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8ef0: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8f00: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8f10: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8f20: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8f30: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8f40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8f50: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
8f60: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
8f70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8f80: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
8f90: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
8fa0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
8fb0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
8fc0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
8fd0: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
8fe0: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
8ff0: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
9000: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9010: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
9020: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
9030: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
9040: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
9050: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
9060: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
9070: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
9080: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9090: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
90a0: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
90b0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
90c0: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
90d0: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
90e0: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
90f0: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
9100: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
9110: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
9120: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
9130: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
9140: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
9150: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9160: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
9170: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
9180: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9190: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
91a0: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
91b0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
91c0: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
91d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
91e0: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
91f0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9200: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9210: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9240: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9260: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
9270: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9280: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9290: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
92a0: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
92b0: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
92c0: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
92d0: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
92e0: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
92f0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
9300: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9310: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
9320: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
9330: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
9340: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
9350: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9360: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
9370: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
9380: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9390: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
93a0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
93b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
93c0: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
93d0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
93e0: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
93f0: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
9400: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
9410: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9420: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
9430: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
9440: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
9450: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
9460: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
9470: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
9480: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9490: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
94a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
94b0: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
94c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
94d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
94e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
94f0: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
9500: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
9510: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
9520: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
9530: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
9540: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
9550: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
9560: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
9570: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
9580: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9590: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
95a0: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
95b0: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
95c0: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
95d0: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
95e0: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
95f0: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
9600: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
9610: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9620: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
9630: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
9640: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9650: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
9660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9670: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
9680: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9690: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
96a0: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
96b0: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
96c0: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
96d0: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
96e0: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
96f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9700: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9710: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9720: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9730: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
9740: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9750: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9760: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9770: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
9780: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
9790: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
97a0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
97b0: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
97c0: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
97d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
97e0: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
97f0: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
9800: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
9810: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
9820: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
9830: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
9850: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
9860: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
9870: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9890: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
98a0: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
98b0: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
98c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
98d0: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
98e0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
98f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9900: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9910: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9920: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
9930: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
9940: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
9950: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
9960: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
9970: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9980: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
9990: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
99a0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
99b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
99c0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
99d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
99f0: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
9a00: 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64  OCK || p->noRead
9a10: 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72  lock );.      br
9a20: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9a30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9a40: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
9a50: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9a60: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9a70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9a80: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9a90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9aa0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ab0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9ac0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ad0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9ae0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9b00: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
9b10: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
9b20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b30: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b40: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
9b50: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
9b60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
9b70: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
9b80: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
9b90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ba0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9bb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
9bc0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9bd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9be0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
9bf0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9c00: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9c10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9c20: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9c30: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9c40: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9c50: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9c60: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
9c70: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
9c80: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
9c90: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
9ca0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
9cb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
9cc0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
9cd0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
9ce0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
9cf0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
9d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
9d10: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
9d20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
9d30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
9d40: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
9d50: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9d60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9d70: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d80: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
9d90: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9da0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9db0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9dc0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9dd0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9de0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9df0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e10: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
9e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9e40: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9e50: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
9e60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e70: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9e80: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
9e90: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
9ea0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9eb0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9ec0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9ed0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9ee0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9ef0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f00: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f10: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f20: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
9f30: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
9f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9f50: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
9f60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
9f70: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9f80: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9f90: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9fa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9fb0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9fc0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9fd0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9fe0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
9ff0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a000: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a010: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a020: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a040: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a050: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a060: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a070: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a080: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a090: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a0b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a0c0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a0d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a0e0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a0f0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a100: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a110: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a120: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a130: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a140: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a150: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a160: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a170: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a180: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a190: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a1a0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a1b0: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a1c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a1d0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a1e0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a1f0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a200: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a210: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a220: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a230: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a240: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a250: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a260: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a270: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a280: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a290: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a2a0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a2b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a2c0: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a2d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a2e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a2f0: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a300: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a310: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a320: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a330: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a340: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a350: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a360: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a370: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a380: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
a390: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
a3a0: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
a3b0: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
a3c0: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
a3d0: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
a3e0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a3f0: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
a400: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
a410: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
a420: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
a430: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
a440: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
a450: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
a460: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
a470: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
a480: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
a490: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
a4a0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
a4b0: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
a4c0: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
a4d0: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
a4e0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
a4f0: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
a500: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
a510: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
a520: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
a530: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
a540: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
a550: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
a560: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
a570: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
a580: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
a590: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
a5a0: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
a5b0: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
a5c0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
a5d0: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
a5e0: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
a5f0: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
a600: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
a610: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a620: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
a630: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
a640: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
a650: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a660: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
a670: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
a680: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a690: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
a6a0: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
a6b0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
a6c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a6d0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a6e0: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
a6f0: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
a700: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a710: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a720: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
a730: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
a740: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a750: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
a760: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
a770: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
a780: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
a790: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
a7a0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
a7b0: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
a7c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a7d0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
a7e0: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
a7f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a800: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a810: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
a820: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
a830: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
a840: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
a850: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a860: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
a870: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
a880: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
a890: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
a8a0: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
a8b0: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
a8c0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
a8d0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a8e0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a8f0: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
a900: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
a910: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a920: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
a930: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
a940: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a950: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a960: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
a970: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
a980: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a990: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a9a0: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
a9b0: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
a9c0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
a9d0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9e0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
a9f0: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
aa00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aa10: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aa20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
aa30: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
aa40: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
aa50: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
aa60: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
aa70: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
aa80: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
aa90: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
aaa0: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
aab0: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
aac0: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
aad0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
aae0: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
aaf0: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
ab00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
ab10: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
ab20: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
ab30: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
ab40: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
ab50: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
ab60: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
ab70: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
ab80: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
ab90: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
aba0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
abb0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
abc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
abd0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
abe0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
abf0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
ac00: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
ac10: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
ac20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
ac30: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
ac40: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
ac50: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
ac60: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
ac70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ac80: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
ac90: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
aca0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
acb0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
acc0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
acd0: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
ace0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
acf0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ad00: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
ad10: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
ad20: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ad30: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
ad40: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
ad50: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
ad60: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
ad70: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
ad80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ad90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ada0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
adb0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
adc0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
add0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
ade0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
adf0: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
ae00: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
ae10: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
ae20: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
ae30: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
ae40: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
ae50: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
ae60: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
ae70: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
ae80: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
ae90: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
aea0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
aeb0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
aec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
aed0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
aee0: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
aef0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
af00: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
af10: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
af20: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
af30: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
af40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
af50: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
af60: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
af70: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
af80: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
af90: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
afa0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
afb0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
afc0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
afd0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
afe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
aff0: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
b000: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
b010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b020: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b030: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b040: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
b050: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
b060: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
b070: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
b080: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
b090: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
b0a0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b0b0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b0c0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
b0d0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
b0e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
b0f0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
b100: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b110: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b120: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
b130: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
b140: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
b150: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
b160: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
b170: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
b180: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
b190: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
b1a0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
b1b0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
b1c0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
b1d0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b1e0: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b1f0: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b200: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
b210: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
b220: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
b230: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
b240: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
b250: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
b260: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
b270: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
b280: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
b290: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
b2a0: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
b2b0: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
b2c0: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
b2d0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
b2e0: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
b2f0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
b300: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
b310: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b320: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
b330: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
b340: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
b350: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b360: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
b370: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b380: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b390: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b3a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
b3b0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
b3c0: 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
b3d0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b3e0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b3f0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b400: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b410: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b420: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b430: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b440: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b450: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b460: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b470: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b480: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b490: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
b4a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b4b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
b4c0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b4d0: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
b4e0: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
b4f0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64  E(("UNLOCK %p %d
b500: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f  \n", pPager, eLo
b510: 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck)).  }.  retur
b520: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b530: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b540: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b550: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b560: 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45   be either SHARE
b570: 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52  D_LOCK,.** RESER
b580: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
b590: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74  USIVE_LOCK. If t
b5a0: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63  he caller is suc
b5b0: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
b5c0: 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  .** Pager.eLock 
b5d0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
b5e0: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b5f0: 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
b600: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b610: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b620: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b630: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
b640: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
b650: 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73   modify it unles
b660: 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  s the new lockin
b670: 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55  g state is EXCLU
b680: 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53  SIVE_LOCK. .** S
b690: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
b6a0: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
b6b0: 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   of UNKNOWN_LOCK
b6c0: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b6d0: 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e  ion .** of this.
b6e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b6f0: 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72  agerLockDb(Pager
b700: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b710: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b720: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b730: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48  ssert( eLock==SH
b740: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ARED_LOCK || eLo
b750: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
b760: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c  K || eLock==EXCL
b770: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
b780: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b790: 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65  k<eLock || pPage
b7a0: 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
b7b0: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  N_LOCK ){.    rc
b7c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
b7d0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
b7e0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
b7f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
b800: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
b810: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
b820: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
b830: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
b840: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  er->eLock = eLoc
b850: 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
b860: 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
b870: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
b880: 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
b890: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b8a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b8b0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
b8c0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
b8d0: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
b8e0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
b8f0: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
b900: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
b910: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
b920: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
b930: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
b940: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
b950: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
b960: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
b970: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
b980: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
b990: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
b9a0: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
b9b0: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
b9c0: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
b9d0: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
b9e0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
b9f0: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
ba00: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   size..**.** The
ba10: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
ba20: 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61   also always ena
ba30: 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  bled for tempora
ba40: 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a  ry files. It is.
ba50: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  ** an error to c
ba60: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
ba70: 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f  n if pPager is o
ba80: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d  pened on an in-m
ba90: 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
baa0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
bab0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
bac0: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
bad0: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
bae0: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
baf0: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
bb00: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
bb10: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
bb20: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
bb30: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
bb40: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
bb50: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
bb60: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
bb70: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
bb80: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
bb90: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
bba0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bbb0: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
bbc0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  B );.  if( !pPag
bbd0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
bbe0: 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20      int dc;     
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
bc10: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
bc20: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74  */.    int nSect
bc30: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
bc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
bc50: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69  or size */.    i
bc60: 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20  nt szPage;      
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
bc90: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
bca0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
bcb0: 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   );.    dc = sql
bcc0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
bcd0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
bce0: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65  er->fd);.    nSe
bcf0: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
bd00: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
bd10: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
bd20: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
bd30: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
bd40: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
bd50: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
bd60: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
bd70: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
bd80: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
bd90: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
bda0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
bdb0: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
bdc0: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
bdd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
bde0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
bdf0: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
be00: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
be10: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
be20: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
be30: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
be40: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
be50: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
be60: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
be70: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
be80: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
be90: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
bea0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
beb0: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
bec0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
bed0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
bee0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
bef0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
bf00: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
bf10: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
bf20: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
bf30: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
bf40: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
bf50: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
bf60: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
bf70: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
bf80: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
bf90: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
bfa0: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
bfb0: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
bfc0: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
bfd0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
bfe0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
bff0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c000: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c010: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c020: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c030: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c040: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c050: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c060: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c070: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c080: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c090: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c0a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c0b0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c0c0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c0d0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c0e0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c0f0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c100: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c110: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c120: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c130: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c140: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c150: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c160: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c170: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c180: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c190: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c1a0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c1b0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c1c0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c1d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c1e0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c1f0: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
c200: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
c210: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
c220: 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  || (pPg->flags&P
c230: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c240: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c250: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c260: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c270: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c280: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c290: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c2a0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c2b0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
c2c0: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
c2d0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
c2e0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
c2f0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
c300: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
c310: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
c320: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
c330: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
c340: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
c350: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c360: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
c370: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
c380: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
c390: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
c3a0: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
c3b0: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
c3c0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
c3d0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
c3e0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
c3f0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
c400: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
c410: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
c420: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
c430: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
c440: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
c450: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
c460: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
c470: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
c480: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
c490: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
c4a0: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
c4b0: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
c4c0: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
c4d0: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
c4e0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
c4f0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
c500: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c510: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
c520: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
c530: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
c540: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
c550: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
c560: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
c570: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
c580: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
c590: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
c5a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c5b0: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
c5c0: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
c5d0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
c5e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c5f0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c600: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
c610: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
c620: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
c630: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
c640: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
c650: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
c660: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c670: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
c680: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
c690: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
c6a0: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
c6b0: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
c6c0: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
c6d0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
c6e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c6f0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c700: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
c710: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
c720: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c730: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
c740: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
c750: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
c760: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c770: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
c780: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c790: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c7a0: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
c7b0: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
c7c0: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
c7d0: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
c7e0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
c7f0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c800: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c810: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
c820: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
c830: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
c840: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
c850: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c860: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
c890: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
c8a0: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
c8b0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c8d0: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
c8e0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
c8f0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
c920: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
c930: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c940: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
c950: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
c960: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
c970: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
c980: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
c990: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
c9a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
c9b0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
c9c0: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
c9d0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
c9e0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
c9f0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
ca00: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
ca10: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
ca20: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
ca30: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
ca40: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
ca50: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
ca60: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
ca70: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
ca80: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
ca90: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
caa0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
cab0: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
cac0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cad0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cae0: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
caf0: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
cb00: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
cb10: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
cb20: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
cb30: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
cb40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cb50: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
cb60: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
cb70: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
cb80: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
cb90: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
cba0: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
cbb0: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
cbc0: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
cbd0: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
cbe0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
cbf0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
cc00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
cc10: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
cc20: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
cc30: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
cc40: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
cc50: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
cc60: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
cc70: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
cc80: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
cc90: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
cca0: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
ccb0: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
ccc0: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
ccd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cce0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
ccf0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
cd00: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
cd10: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
cd20: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
cd30: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
cd40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cd50: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
cd60: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
cd70: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
cd80: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
cd90: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
cda0: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
cdb0: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
cdc0: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
cdd0: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
cde0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce20: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
ce30: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
ce40: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
ce50: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
ce70: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
cea0: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
ceb0: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
cec0: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
ced0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
cee0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
cef0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
cf00: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
cf10: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
cf20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cf30: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
cf40: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
cf50: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
cf60: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
cf70: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
cf80: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
cf90: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
cfa0: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
cfb0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
cfc0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
cfd0: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
cfe0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
cff0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d000: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d010: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d020: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d030: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d050: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d060: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d070: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d080: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d090: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d0a0: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d0b0: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d0c0: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d0d0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d0e0: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d0f0: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d100: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d110: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d120: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d130: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d140: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d150: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d160: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d170: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d180: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
d190: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
d1a0: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
d1b0: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
d1c0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
d1d0: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
d1e0: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
d1f0: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
d200: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
d210: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
d220: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
d230: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
d240: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
d250: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
d260: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
d270: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
d280: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
d290: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
d2a0: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
d2b0: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
d2c0: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d2d0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
d2e0: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
d2f0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
d300: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
d310: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
d320: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
d330: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
d340: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
d350: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
d360: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
d370: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d380: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
d390: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
d3a0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
d3b0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
d3c0: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
d3d0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
d3e0: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
d3f0: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
d400: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d430: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d440: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
d450: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
d460: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
d470: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
d480: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
d490: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d4a0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
d4b0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d4c0: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
d4d0: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
d4e0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
d4f0: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
d500: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
d510: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d520: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d530: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
d540: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d550: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
d560: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
d570: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
d580: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d590: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
d5a0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
d5b0: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
d5c0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d5d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
d5e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
d5f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d600: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
d610: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
d620: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
d630: 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
d640: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
d650: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
d660: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
d670: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
d680: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
d690: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
d6a0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
d6b0: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
d6c0: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
d6d0: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
d6e0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
d6f0: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
d700: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
d710: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
d720: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
d730: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
d740: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
d750: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
d760: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
d770: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
d780: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
d790: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
d7a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
d7b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
d7c0: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
d7d0: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
d7e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d7f0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
d800: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
d810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d820: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
d830: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d840: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
d850: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
d860: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
d870: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d880: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
d890: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d8a0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d8b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d8c0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
d8d0: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
d8e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
d8f0: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
d900: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
d910: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
d920: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
d930: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
d940: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
d950: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
d960: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
d970: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
d980: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
d990: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
d9a0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
d9b0: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
d9c0: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
d9d0: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
d9e0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
d9f0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
da00: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
da10: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
da20: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
da30: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
da40: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
da50: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
da60: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
da70: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
da80: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
da90: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
daa0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
dab0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
dac0: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
dad0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
dae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
daf0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
db00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
db10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
db20: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
db30: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
db40: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
db50: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
db60: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
db70: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
db80: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
db90: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
dba0: 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61  eader = (u32)pPa
dbb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a  ger->pageSize;/*
dbc0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
dbd0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
dbe0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dbf0: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc10: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
dc20: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
dc30: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
dc60: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
dc70: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
dc80: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
dc90: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
dca0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
dcb0: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
dcc0: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
dcd0: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
dce0: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
dcf0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
dd00: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
dd10: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
dd20: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
dd30: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
dd40: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
dd50: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
dd60: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
dd70: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
dd80: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
dd90: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
dda0: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
ddb0: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
ddc0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
ddd0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
dde0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
ddf0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
de00: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
de10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
de20: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
de30: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
de40: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
de50: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
de60: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
de70: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
de80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
de90: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
dea0: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
deb0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
dec0: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
ded0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
dee0: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
def0: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
df00: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
df10: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
df20: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
df30: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
df40: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
df50: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
df60: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
df70: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
df80: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
df90: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
dfa0: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
dfb0: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
dfc0: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
dfd0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
dfe0: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
dff0: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
e000: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
e010: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
e020: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
e030: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
e040: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
e050: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
e060: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
e070: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
e080: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
e090: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
e0a0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
e0b0: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
e0c0: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
e0d0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
e0e0: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
e0f0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
e100: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
e110: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
e120: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
e130: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
e140: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
e150: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
e160: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
e170: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
e180: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
e190: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e1a0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
e1b0: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
e1c0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
e1d0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
e1e0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
e1f0: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
e200: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e210: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
e220: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
e230: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
e240: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
e250: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
e260: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
e270: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
e280: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
e290: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
e2a0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
e2b0: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
e2c0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
e2d0: 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61  ->noSync || (pPa
e2e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e2f0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e300: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
e310: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
e320: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
e330: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
e340: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e350: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
e360: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
e370: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
e380: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
e390: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
e3a0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e3b0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e3c0: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
e3d0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
e3e0: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
e3f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
e400: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
e410: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
e420: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
e430: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
e440: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
e450: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
e460: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
e470: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e480: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
e490: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e4a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
e4b0: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
e4c0: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
e4d0: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
e4e0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
e4f0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e500: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e510: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
e520: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
e530: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
e540: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
e550: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
e560: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e570: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e580: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
e590: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
e5a0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
e5b0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e5c0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e5d0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e5e0: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
e5f0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
e600: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
e610: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
e620: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
e630: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
e640: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
e650: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
e660: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
e670: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
e680: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
e690: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
e6a0: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
e6b0: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
e6c0: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
e6d0: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
e6e0: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
e6f0: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
e700: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
e710: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e720: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
e730: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
e740: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e750: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
e760: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
e770: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
e780: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
e790: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
e7a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
e7b0: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
e7c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
e7d0: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
e7e0: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
e7f0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
e800: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
e810: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
e820: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
e830: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
e840: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
e850: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
e860: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
e870: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
e880: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
e890: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
e8a0: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
e8b0: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
e8c0: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
e8d0: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
e8e0: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
e8f0: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
e900: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
e910: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
e920: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
e930: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
e940: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
e950: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
e960: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
e970: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
e980: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
e990: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
e9a0: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
e9b0: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
e9c0: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
e9d0: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
e9e0: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
e9f0: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
ea00: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
ea10: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
ea20: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
ea30: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
ea40: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
ea50: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
ea60: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
ea70: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
ea80: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
ea90: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
eaa0: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
eab0: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
eac0: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
ead0: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
eae0: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
eaf0: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
eb00: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
eb10: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
eb20: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
eb30: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
eb40: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
eb50: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
eb60: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
eb70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
eb80: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
eb90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
eba0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
ebb0: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
ebc0: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
ebd0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
ebe0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
ebf0: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
ec00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ec10: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
ec20: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
ec30: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
ec40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ec50: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
ec60: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
ec70: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
ec80: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
ec90: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
eca0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
ecb0: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
ecc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
ecd0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
ece0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
ecf0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
ed00: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
ed10: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
ed20: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
ed30: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
ed40: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
ed50: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
ed60: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
ed70: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
ed80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
ed90: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
eda0: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
edb0: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
edc0: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
edd0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
ede0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
edf0: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
ee00: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
ee10: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
ee20: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
ee30: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
ee40: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
ee50: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
ee60: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
ee70: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
ee80: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
ee90: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
eea0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
eeb0: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
eec0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
eed0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
eee0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
eef0: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
ef00: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
ef10: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
ef20: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
ef30: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
ef40: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
ef50: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
ef60: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
ef70: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
ef80: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
ef90: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
efa0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
efb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
efc0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
efd0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eff0: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
f000: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
f010: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f030: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
f040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
f050: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
f060: 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
f070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
f080: 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
f090: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
f0a0: 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
f0b0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
f0c0: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f0d0: 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
f0e0: 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
f0f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f120: 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
f130: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
f140: 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
f150: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
f160: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
f170: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f190: 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
f1a0: 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
f1b0: 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
f1c0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f1d0: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
f1e0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
f1f0: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
f200: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
f210: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
f220: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
f230: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
f240: 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
f250: 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
f260: 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
f270: 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
f280: 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
f290: 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
f2a0: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
f2b0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
f2c0: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
f2d0: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
f2e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f2f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
f300: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f310: 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
f320: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f330: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
f340: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
f350: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
f360: 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
f370: 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
f380: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
f390: 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
f3a0: 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
f3b0: 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
f3c0: 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
f3d0: 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
f3e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
f3f0: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
f400: 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
f410: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
f420: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f430: 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
f440: 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
f450: 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
f460: 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
f470: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
f480: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f490: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
f4a0: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
f4b0: 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
f4c0: 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
f4d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f4e0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
f4f0: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
f500: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
f510: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
f520: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
f530: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f550: 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
f560: 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
f570: 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
f580: 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
f590: 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
f5a0: 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
f5b0: 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
f5c0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
f5d0: 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
f5e0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
f5f0: 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
f600: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
f610: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
f620: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
f630: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
f640: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
f650: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
f660: 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
f670: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f680: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
f690: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
f6a0: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
f6b0: 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
f6c0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f6d0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
f6e0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
f6f0: 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
f700: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
f710: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
f720: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
f730: 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
f740: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
f750: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
f760: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
f770: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
f780: 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
f790: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
f7a0: 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
f7b0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
f7c0: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  header */..    /
f7d0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
f7e0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
f7f0: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
f800: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
f810: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
f820: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f830: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f840: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
f850: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
f860: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f870: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f880: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f890: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
f8a0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
f8b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f8c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
f8d0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
f8e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
f8f0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
f900: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
f910: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
f920: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
f930: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
f940: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
f950: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
f960: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
f970: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
f980: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
f990: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
f9a0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
f9b0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
f9c0: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
f9d0: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
f9e0: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
f9f0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
fa00: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
fa10: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
fa20: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
fa30: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
fa40: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
fa50: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
fa60: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
fa70: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
fa80: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
fa90: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
faa0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
fab0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fac0: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
fad0: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
fae0: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
faf0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
fb00: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
fb10: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
fb20: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
fb30: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
fb40: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
fb50: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
fb60: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
fb70: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
fb80: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
fb90: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
fba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
fbb0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
fbc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbd0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
fbe0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
fbf0: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
fc00: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
fc10: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
fc20: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
fc30: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
fc40: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
fc50: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
fc60: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
fc70: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
fc80: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
fc90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
fca0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fcb0: 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
fcc0: 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29   &iPageSize, -1)
fcd0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
fce0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
fcf0: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
fd00: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
fd10: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
fd20: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
fd30: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
fd40: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
fd50: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
fd60: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
fd70: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
fd80: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
fd90: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
fda0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
fdb0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
fdc0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
fdd0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
fde0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
fdf0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
fe00: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
fe10: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
fe20: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
fe30: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
fe40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
fe50: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
fe60: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
fe70: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
fe80: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
fe90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
fea0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
feb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
fec0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
fed0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
fee0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
fef0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
ff00: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
ff10: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
ff20: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
ff30: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
ff40: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
ff50: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
ff60: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
ff70: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
ff80: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
ff90: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
ffa0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
ffb0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
ffc0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
ffd0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
ffe0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
fff0: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
10000 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
10010 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
10020 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
10030 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
10040 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
10050 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
10060 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
10070 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
10080 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10090 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
100a0 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
100b0 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
100c0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
100d0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
100e0 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
100f0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
10100 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10110 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
10120 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
10130 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
10140 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
10150 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
10160 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
10170 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
10180 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
10190 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
101a0 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
101b0 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
101c0 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
101d0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
101e0 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
101f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10200 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
10210 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
10220 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
10230 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
10240 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10270 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
10280 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
10290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
102a0 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
102b0 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
102c0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
102d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
102e0 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
102f0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
10300 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
10310 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10320 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
10340 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
10350 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
10360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10370 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
10380 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
10390 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
103a0 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
103b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
103c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
103d0 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
103e0 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  r .   || pPager-
103f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10400 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10410 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
10420 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
10430 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
10440 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
10450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10460 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10470 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
10480 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
10490 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
104a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
104b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
104c0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
104d0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
104e0 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
104f0 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10500 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10510 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10520 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10530 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10540 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10550 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10560 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10570 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
10580 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
10590 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
105a0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
105b0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
105c0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
105d0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
105e0 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
105f0 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
10600 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
10610 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
10620 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
10630 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
10640 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
10650 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10660 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
10670 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
10680 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
10690 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
106a0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
106b0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
106c0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
106d0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
106e0 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
106f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10700 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10710 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10720 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
10730 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
10740 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
10750 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
10760 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
10770 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
10780 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10790 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
107a0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
107b0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
107c0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
107d0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
107e0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
107f0 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10800 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
10810 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10820 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
10830 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10840 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
10850 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
10860 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10870 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10880 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
10890 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
108a0 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
108b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
108c0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
108d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
108e0 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
108f0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
10900 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
10910 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
10920 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
10930 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
10940 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
10950 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10960 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10970 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
10980 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
10990 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
109a0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
109b0 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
109c0 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
109d0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
109e0 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
109f0 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
10a00 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
10a10 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
10a20 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
10a30 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
10a40 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
10a50 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
10a60 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
10a70 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
10a80 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
10a90 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
10aa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
10ab0 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
10ac0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
10ad0 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
10ae0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
10af0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10b00 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
10b10 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
10b20 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
10b30 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
10b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
10b50 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
10b60 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10b70 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
10b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10b90 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
10ba0 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
10bb0 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
10bc0 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
10bd0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
10be0 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
10bf0 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
10c00 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
10c10 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
10c20 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
10c30 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
10c40 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
10c50 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
10c60 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
10c90 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
10ca0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
10cb0 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
10cc0 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
10cd0 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
10ce0 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
10cf0 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
10d00 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
10d10 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
10d20 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
10d30 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
10d40 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
10d50 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
10d60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
10d70 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
10d80 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
10d90 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
10da0 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
10db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10dc0 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
10dd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
10de0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
10df0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
10e00 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
10e10 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
10e20 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
10e30 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
10e40 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
10e50 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
10e60 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
10e70 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
10e80 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
10e90 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
10ea0 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
10eb0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
10ec0 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
10ed0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
10ee0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
10ef0 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
10f00 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
10f10 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
10f20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
10f30 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
10f40 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
10f50 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
10f60 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
10f70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
10f80 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
10f90 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
10fa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
10fb0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
10fc0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
10fd0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
10fe0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
10ff0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11000 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
11010 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
11020 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
11030 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
11040 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
11050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11060 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11070 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
11080 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11090 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
110a0 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
110b0 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
110c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
110d0 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
110e0 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
110f0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
11100 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
11110 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
11120 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
11130 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
11140 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
11150 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
11160 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
11170 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
11180 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
11190 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
111a0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
111b0 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
111e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
111f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
11200 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11210 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
11220 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11230 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11240 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
11250 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
11260 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
11270 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
11280 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
11290 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
112a0 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
112b0 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
112c0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
112d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
112e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
112f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
11300 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11310 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11320 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11330 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11340 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
11350 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11360 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
11370 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
11380 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
11390 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
113a0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
113b0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
113c0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
113d0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
113e0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
113f0 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
11400 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
11410 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
11420 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
11430 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
11440 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
11450 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
11460 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
11470 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
11480 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
11490 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
114a0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
114b0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
114c0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
114d0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
114e0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
114f0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
11500 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
11510 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11520 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
11530 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
11540 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
11550 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
11560 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
11570 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
11580 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
11590 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
115a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
115b0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
115c0 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
115d0 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
115e0 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
115f0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
11600 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
11610 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11620 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
11630 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
11640 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
11650 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11660 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
11670 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
11680 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
11690 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
116a0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
116b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
116c0 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
116d0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
116e0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
116f0 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
11700 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11710 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
11720 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
11730 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
11740 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11750 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  s(pPager);..  if
11760 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
11770 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
11780 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
11790 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
117a0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
117b0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
117c0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
117d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
117e0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
117f0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
11800 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11810 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   ){.    int rc; 
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
11840 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
11850 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20  pagerUnlockDb() 
11860 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  */.    int iDc =
11870 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
11880 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76  fd)?sqlite3OsDev
11890 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
118a0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30  cs(pPager->fd):0
118b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
118c0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
118d0 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69  m support deleti
118e0 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73  on of open files
118f0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c  , then.    ** cl
11900 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
11910 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
11920 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
11930 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65  lock.  Otherwise
11940 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20  .    ** another 
11950 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
11960 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
11970 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65  ete might delete
11980 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11990 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
119a0 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  us..    */.    a
119b0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
119c0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
119d0 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
119e0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
119f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
11a00 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
11a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11a20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11a30 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31  WAL      & 5)!=1
11a40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11a50 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11a60 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29  DE_DELETE   & 5)
11a70 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11a80 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11a90 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
11aa0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
11ab0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11ac0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
11ad0 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20    & 5)==1 );.   
11ae0 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53   if( 0==(iDc & S
11af0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
11b00 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11b10 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70  N).     || 1!=(p
11b20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
11b30 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20  de & 5).    ){. 
11b40 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11b50 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
11b60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11b70 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11b80 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
11b90 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  te and the call 
11ba0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
11bb0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
11bc0 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68  le fails, set th
11bd0 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74  e current lock t
11be0 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20  o UNKNOWN_LOCK. 
11bf0 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  See the comment.
11c00 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65      ** above the
11c10 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b   #define for UNK
11c20 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
11c30 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
11c40 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  why this.    ** 
11c50 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
11c60 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
11c70 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
11c80 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  er, NO_LOCK);.  
11c90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11ca0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
11cb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11cc0 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OR ){.      pPag
11cd0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e  er->eLock = UNKN
11ce0 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  OWN_LOCK;.    }.
11cf0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
11d00 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63  r state may be c
11d10 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45  hanged from PAGE
11d20 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52  R_ERROR to PAGER
11d30 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a  _OPEN here.    *
11d40 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69  * without cleari
11d50 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ng the error cod
11d60 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e  e. This is inten
11d70 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72  tional - the err
11d80 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69  or.    ** code i
11d90 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68  s cleared and th
11da0 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e  e cache reset in
11db0 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77   the block below
11dc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
11de0 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
11df0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
11e00 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ROR );.    pPage
11e10 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
11e20 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
11e30 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11e40 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20  ER_OPEN;.  }..  
11e50 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
11e60 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
11e70 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11e80 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
11e90 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74  ot be.  ** trust
11ea0 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
11eb0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
11ec0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
11ed0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20   to the pager,. 
11ee0 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c   ** it can safel
11ef0 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50  y move back to P
11f00 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e  AGER_OPEN state.
11f10 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
11f20 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61   both.  ** norma
11f30 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d  l and exclusive-
11f40 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20  locking mode..  
11f50 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
11f60 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
11f70 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
11f80 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
11f90 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
11fa0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
11fb0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
11fc0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70  >tempFile;.    p
11fd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
11fe0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
11ff0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12000 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
12010 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12020 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
12030 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12040 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12050 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
12060 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12070 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
12080 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
12090 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
120a0 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
120b0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
120c0 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
120d0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
120e0 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
120f0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12100 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12110 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12120 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
12130 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
12140 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
12150 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12160 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
12170 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
12180 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
12190 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
121a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
121b0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
121c0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
121d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
121e0 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
121f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
12200 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
12210 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
12220 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
12230 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12240 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
12250 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
12260 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
12270 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
12280 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
12290 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
122a0 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
122b0 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
122c0 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
122d0 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
122e0 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
122f0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
12300 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
12310 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12320 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
12330 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
12340 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
12350 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
12360 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
12370 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
12380 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12390 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
123a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
123b0 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
123c0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
123d0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
123e0 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
123f0 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
12400 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
12410 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
12420 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12440 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
12450 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
12460 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
12470 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
12480 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
12490 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
124a0 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
124b0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
124c0 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
124d0 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
124e0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
124f0 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
12500 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
12510 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12520 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
12530 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12540 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
12550 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
12560 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
12570 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
12580 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
12590 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
125a0 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
125b0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
125c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
125d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
125e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
125f0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
12600 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
12610 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
12620 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
12630 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
12640 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
12650 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
12660 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
12670 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
12680 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
12690 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
126a0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
126b0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
126c0 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
126d0 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
126e0 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
126f0 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
12700 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
12710 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12720 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
12730 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
12740 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
12750 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
12760 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
12770 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
12780 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
12790 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
127a0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
127b0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
127c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
127d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
127e0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
127f0 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
12800 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
12810 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
12820 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
12830 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
12840 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
12850 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
12860 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
12870 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
12880 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
12890 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
128a0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
128b0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
128c0 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
128d0 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
128e0 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
128f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
12900 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
12910 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12920 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
12930 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12940 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
12950 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
12960 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
12970 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
12980 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
12990 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
129a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
129b0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
129c0 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
129d0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
129e0 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
129f0 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
12a00 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
12a10 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
12a20 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
12a30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
12a40 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
12a50 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
12a60 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
12a70 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
12a80 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12a90 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
12aa0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
12ab0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
12ac0 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
12ad0 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
12ae0 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
12af0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
12b00 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
12b10 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
12b20 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
12b30 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
12b40 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
12b50 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
12b60 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12b70 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
12b80 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
12b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12ba0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
12bb0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
12bc0 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
12bd0 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
12be0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12bf0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12c00 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
12c10 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
12c20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
12c30 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
12c40 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
12c50 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
12c60 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
12c70 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
12c80 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12c90 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
12ca0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
12cb0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
12cc0 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
12cd0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
12ce0 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
12cf0 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12d00 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
12d10 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
12d20 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
12d30 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
12d40 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
12d50 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
12d60 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
12d70 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
12d80 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
12d90 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
12da0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
12db0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
12dc0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12dd0 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
12de0 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
12df0 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
12e00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
12e10 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
12e20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
12e30 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
12e40 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
12e50 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
12e60 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
12e70 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
12e80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
12e90 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
12ea0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
12eb0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
12ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12ed0 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
12ee0 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
12ef0 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
12f00 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
12f10 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
12f20 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
12f30 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
12f40 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
12f50 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
12f60 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
12f70 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
12f80 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
12f90 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
12fa0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
12fb0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
12fc0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
12fd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
12fe0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
12ff0 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13000 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13010 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13020 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13030 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13040 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13050 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13060 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13070 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
13080 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
13090 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
130a0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
130b0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
130c0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
130d0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
130e0 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
130f0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13100 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13110 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13120 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13130 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13140 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13150 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13160 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13170 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
13180 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
13190 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
131a0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
131b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
131c0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
131d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
131e0 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
131f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13200 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13210 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13220 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13230 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13240 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13250 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13260 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13270 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
13280 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
13290 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
132a0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
132b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
132c0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
132d0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
132e0 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
132f0 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13300 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13310 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13320 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13330 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13340 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13350 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13360 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13370 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
13380 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
13390 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
133a0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
133b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
133c0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
133d0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
133e0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
133f0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13400 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13410 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13420 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13430 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13440 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13450 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13460 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13470 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13480 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
13490 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
134a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
134b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
134c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
134d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
134e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
134f0 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
13500 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13510 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
13520 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
13530 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13540 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
13550 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
13560 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13570 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
13580 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13590 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
135a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
135b0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
135c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
135d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
135e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
135f0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
13600 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13610 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13620 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
13630 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
13640 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13650 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
13660 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
13670 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
13680 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
13690 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
136a0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
136b0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
136c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
136d0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
136e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
136f0 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
13700 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
13710 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
13720 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
13730 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
13740 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
13750 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
13760 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
13770 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
13780 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
13790 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
137a0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
137b0 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
137c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
137d0 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
137e0 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
137f0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
13800 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
13810 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13820 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13830 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
13840 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
13850 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13860 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13870 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13880 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13890 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
138a0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
138b0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
138c0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
138d0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
138e0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
138f0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
13900 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
13910 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13920 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13930 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13940 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13950 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
13960 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13970 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
13980 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
13990 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
139a0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
139b0 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  sh);.#endif.  }.
139c0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
139d0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
139e0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
139f0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
13a00 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13a10 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
13a20 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
13a30 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
13a40 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
13a50 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
13a60 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
13a70 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
13a80 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
13a90 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
13aa0 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
13ab0 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
13ac0 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
13ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
13ae0 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
13af0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
13b00 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
13b10 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
13b20 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
13b30 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
13b40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13b50 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
13b60 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
13b70 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
13b80 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
13b90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
13ba0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
13bb0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
13bc0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13bd0 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
13be0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
13bf0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
13c00 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
13c10 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
13c20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
13c30 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
13c40 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
13c50 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
13c60 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
13c70 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
13c80 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
13c90 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
13ca0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
13cb0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
13cc0 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
13cd0 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
13ce0 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
13cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
13d00 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
13d10 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
13d20 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
13d30 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
13d40 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
13d50 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
13d60 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
13d70 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
13d80 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
13d90 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
13da0 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
13db0 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
13dc0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
13dd0 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
13de0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
13df0 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
13e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
13e10 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
13e20 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
13e30 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
13e40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
13e50 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
13e60 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
13e70 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
13e80 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
13e90 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
13ea0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
13eb0 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
13ec0 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
13ed0 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
13ee0 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
13ef0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
13f00 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
13f10 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
13f20 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
13f30 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
13f40 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
13f50 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
13f60 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
13f70 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
13f80 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
13f90 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
13fa0 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
13fb0 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
13fc0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
13fd0 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
13fe0 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
13ff0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
14000 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
14010 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14020 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14030 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
14040 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
14050 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
14060 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14070 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
14080 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
14090 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
140a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
140b0 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
140c0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
140d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
140e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
140f0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14110 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14120 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14130 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
14140 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
14150 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14160 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
14170 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
14180 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14190 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
141a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
141b0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
141c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
141d0 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
141e0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
141f0 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
14200 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
14210 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
14220 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
14230 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
14240 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
14250 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
14260 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
14270 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
14280 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14290 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
142a0 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
142b0 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
142c0 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
142d0 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
142e0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
142f0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14300 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
14310 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
14320 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
14330 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
14340 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
14350 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
14360 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
14370 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
14380 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
14390 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
143a0 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
143b0 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
143c0 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
143d0 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
143e0 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
143f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
14400 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
14410 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
14420 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
14430 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
14440 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
14450 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
14460 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
14470 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14480 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
14490 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
144a0 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
144b0 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
144c0 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
144d0 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
144e0 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
144f0 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
14500 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
14510 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
14520 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
14530 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
14540 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
14550 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
14560 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
14570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
14580 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
14590 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
145a0 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
145b0 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
145c0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
145d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
145e0 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
145f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
14600 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
14610 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
14620 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
14630 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
14640 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
14650 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
14660 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
14670 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
14680 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
14690 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
146a0 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
146b0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
146c0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
146d0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
146e0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
146f0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
14700 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
14710 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14720 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
14730 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
14740 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
14750 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
14760 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
14770 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
147a0 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
147b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
147c0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
147d0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
147e0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
147f0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
14800 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
14810 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
14820 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
14830 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
14840 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
14850 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
14860 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
14870 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
14880 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
14890 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
148a0 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
148b0 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
148c0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
148d0 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
148e0 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
148f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
14900 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
14910 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
14920 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
14930 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
14940 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
14950 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
14960 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
14970 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14980 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
14990 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
149a0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
149b0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
149c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
149d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
149e0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
149f0 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
14a00 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
14a10 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
14a20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
14a30 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
14a40 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
14a50 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
14a60 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
14a70 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
14a80 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
14a90 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
14aa0 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
14ab0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
14ac0 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
14ad0 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
14ae0 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
14af0 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
14b00 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
14b10 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
14b20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
14b30 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
14b40 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
14b50 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
14b60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
14b70 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
14b80 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
14b90 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14ba0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
14bb0 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
14bc0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
14bd0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
14be0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
14bf0 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
14c00 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
14c10 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
14c20 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
14c30 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
14c40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14c50 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
14c60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
14c70 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
14c80 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
14c90 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14ca0 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14cb0 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
14cc0 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
14cd0 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
14ce0 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
14cf0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
14d00 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
14d10 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
14d20 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
14d30 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
14d40 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
14d50 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
14d60 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
14d70 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
14d80 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
14d90 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
14da0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
14db0 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
14dc0 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
14dd0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
14de0 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
14df0 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
14e00 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
14e10 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
14e20 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
14e30 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
14e40 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
14e50 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
14e60 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
14e70 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
14e80 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
14e90 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
14ea0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
14eb0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
14ec0 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
14ed0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
14ee0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
14ef0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
14f00 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
14f10 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
14f20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f40 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
14f50 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
14f60 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f80 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
14f90 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
14fa0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
14fb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14fc0 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
14fd0 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
14fe0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
14ff0 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
15000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
15010 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
15020 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
15030 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
15040 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
15050 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
15060 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
15070 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
15080 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
15090 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
150a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
150b0 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
150c0 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
150d0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
150e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
150f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15100 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
15110 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
15120 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
15130 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15140 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
15150 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
15160 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15180 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
15190 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
151a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
151b0 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
151c0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
151d0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
151e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
151f0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
15200 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15210 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
15220 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
15230 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
15240 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
15250 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
15260 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
15270 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15280 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
15290 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
152a0 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
152b0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
152c0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
152d0 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
152e0 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
152f0 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
15300 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
15310 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
15320 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
15330 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
15340 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
15350 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
15360 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15370 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
15380 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
15390 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
153a0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
153b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
153c0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
153d0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
153e0 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
153f0 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
15400 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
15410 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
15420 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
15430 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
15440 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15450 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
15460 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
15470 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
15480 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
15490 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
154a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
154b0 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
154c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
154d0 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
154e0 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
154f0 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
15500 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
15510 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
15520 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
15530 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
15540 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
15550 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
15560 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
15570 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15580 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15590 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
155a0 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
155b0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
155c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
155d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
155e0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
155f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
15600 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15610 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
15620 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
15630 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15640 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
15650 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
15660 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
15670 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
15680 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
15690 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
156a0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
156b0 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
156c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
156d0 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
156e0 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
156f0 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
15700 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
15710 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15720 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15730 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
15740 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
15750 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
15760 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
15770 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
15780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15790 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
157a0 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
157b0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
157c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
157d0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
157e0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
157f0 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
15800 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
15810 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
15820 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
15830 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
15840 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
15850 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
15860 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
15870 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
15880 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
15890 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
158a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
158b0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
158c0 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
158d0 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
158e0 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
158f0 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
15900 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
15910 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
15920 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
15930 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
15940 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
15950 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
15960 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
15970 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
15980 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
15990 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
159a0 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
159b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
159c0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
159d0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
159e0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
159f0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
15a00 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
15a10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15a20 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
15a30 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
15a40 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
15a50 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
15a60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15a70 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
15a80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15a90 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
15aa0 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
15ab0 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
15ac0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
15ad0 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
15ae0 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
15af0 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
15b00 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
15b10 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
15b20 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
15b30 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
15b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15b50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
15b60 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
15b70 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
15b80 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
15b90 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
15ba0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
15bb0 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
15bc0 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
15bd0 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
15be0 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
15bf0 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
15c00 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
15c10 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
15c20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
15c30 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
15c40 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
15c50 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
15c60 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
15c70 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
15c80 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
15c90 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
15ca0 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
15cb0 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
15cc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15cd0 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
15ce0 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
15cf0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
15d00 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
15d10 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
15d20 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
15d30 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
15d40 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
15d50 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
15d60 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
15d70 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
15d80 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
15d90 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
15da0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
15db0 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
15dc0 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
15dd0 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
15de0 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
15df0 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
15e00 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
15e10 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
15e20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
15e30 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
15e40 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
15e50 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
15e60 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
15e70 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
15e80 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
15e90 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
15ea0 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
15eb0 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
15ec0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
15ed0 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
15ee0 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
15ef0 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
15f00 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
15f10 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
15f20 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
15f30 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
15f40 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
15f50 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
15f60 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15f70 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
15f80 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
15f90 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
15fa0 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
15fb0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
15fc0 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
15fd0 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
15fe0 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
15ff0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
16000 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
16010 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
16020 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
16030 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16040 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
16050 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16060 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
16070 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
16080 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
16090 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
160a0 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
160b0 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
160c0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
160d0 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
160e0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
160f0 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
16100 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
16110 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
16120 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
16130 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
16140 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
16150 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
16160 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
16170 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
16180 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
16190 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
161a0 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
161b0 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
161c0 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
161d0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
161e0 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
161f0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
16200 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16210 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
16220 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
16230 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
16240 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
16250 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
16260 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
16270 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
16280 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
16290 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
162a0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
162b0 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
162c0 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
162d0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
162e0 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
162f0 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
16300 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
16310 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
16320 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
16330 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
16340 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
16350 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
16360 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
16370 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
16380 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
16390 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
163a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
163b0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
163c0 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
163d0 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
163e0 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
163f0 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
16400 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
16410 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
16420 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
16430 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
16440 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
16450 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
16460 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
16470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
16480 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
16490 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
164a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
164b0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
164c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
164d0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
164e0 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
164f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
16500 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
16510 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
16520 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16530 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16540 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
16550 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
16560 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
16570 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
16580 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
16590 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
165a0 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
165b0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
165c0 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
165d0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
165e0 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
165f0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
16600 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
16610 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
16620 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
16630 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
16640 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
16650 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
16660 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
16670 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
16680 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
16690 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
166a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
166b0 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
166c0 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
166d0 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
166e0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
166f0 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
16700 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
16710 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
16720 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
16730 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
16740 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
16750 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16760 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
16770 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
16780 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61  er->fd, (u8*)aDa
16790 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
167a0 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
167b0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
167c0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
167d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
167e0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
167f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16800 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
16810 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  {.      CODEC1(p
16820 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
16830 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
16840 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73  _NOMEM);.      s
16850 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
16860 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
16870 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
16880 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44  Data);.      COD
16890 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
168a0 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
168b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61  QLITE_NOMEM, aDa
168c0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ta);.    }.  }el
168d0 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72  se if( !isMainJr
168e0 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a  nl && pPg==0 ){.
168f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
16900 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  s a rollback of 
16910 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  a savepoint and 
16920 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69  data was not wri
16930 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74  tten to.    ** t
16940 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
16950 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
16960 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65  in-memory, there
16970 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a   is a potential.
16980 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20      ** problem. 
16990 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  When the page is
169a0 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79   next fetched by
169b0 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
169c0 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  r, it .    ** wi
169d0 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
169e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
169f0 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  e, which may or 
16a00 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  may not be .    
16a10 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20  ** current. .   
16a20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65   **.    ** There
16a30 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66   are a couple of
16a40 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20   different ways 
16a50 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e  this can happen.
16a60 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20   All are quite. 
16a70 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57     ** obscure. W
16a80 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73  hen running in s
16a90 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
16aa0 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   this can only h
16ab0 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66  appen .    ** if
16ac0 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20   the page is on 
16ad0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74  the free-list at
16ae0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16af0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
16b00 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  hen.    ** popul
16b10 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64  ated, then moved
16b20 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
16b30 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20  gerMovepage().. 
16b40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
16b50 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
16b60 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  add an in-memory
16b70 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63   page to the cac
16b80 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  he containing.  
16b90 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75    ** the data ju
16ba0 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  st read from the
16bb0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61   sub-journal. Ma
16bc0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
16bd0 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64  irty .    ** and
16be0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65   if the pager re
16bf0 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c  quires a journal
16c00 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b  -sync, then mark
16c10 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20   the page as .  
16c20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61    ** requiring a
16c30 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65   journal-sync be
16c40 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74  fore it is writt
16c50 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
16c60 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
16c70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16c80 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
16c90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ll==0 );.    pPa
16ca0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b  ger->doNotSpill+
16cb0 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  +;.    rc = sqli
16cc0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
16cd0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
16ce0 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
16cf0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
16d00 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  tSpill==1 );.   
16d10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
16d20 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72  ill--;.    if( r
16d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
16d50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
16d60 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
16d70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
16d80 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
16d90 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
16da0 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
16db0 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
16dc0 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
16dd0 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
16de0 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
16df0 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
16e00 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
16e10 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
16e20 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
16e30 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
16e40 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
16e50 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
16e60 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
16e70 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
16e80 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
16e90 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
16ea0 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
16eb0 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
16ec0 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
16ed0 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
16ee0 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
16ef0 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
16f00 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
16f10 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75  memcpy(pData, (u
16f20 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
16f30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
16f40 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
16f50 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  er(pPg);.    if(
16f60 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28   isMainJrnl && (
16f70 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70  !isSavepnt || *p
16f80 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e  Offset<=pPager->
16f90 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
16fa0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
16fb0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
16fc0 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
16fd0 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
16fe0 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
16ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17000 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
17010 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
17020 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
17030 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
17040 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
17050 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
17060 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
17070 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
17080 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
17090 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
170a0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
170b0 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20  t out to the.   
170c0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
170d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
170e0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  * There is one e
170f0 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
17100 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61   rule. If the pa
17110 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  ge is being roll
17120 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
17130 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61   as part of a sa
17140 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74  vepoint (or stat
17150 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20  ement) rollback 
17160 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a  from an .      *
17170 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  * unsynced porti
17180 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  on of the main j
17190 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
171a0 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  n it is not safe
171b0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72  .      ** to mar
171c0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
171d0 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63  ean. This is bec
171e0 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65  ause marking the
171f0 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a   page as.      *
17200 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65  * clean will cle
17210 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
17220 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e  D_SYNC flag. Sin
17230 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  ce the page is. 
17240 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
17250 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
17260 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e  ile (recorded in
17270 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
17280 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  l) and.      ** 
17290 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
172a0 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61  YNC flag is clea
172b0 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65  red, if the page
172c0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
172d0 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
172e0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
172f0 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ction, it will b
17300 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
17310 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  y but.      ** t
17320 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17330 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74  NC flag will not
17340 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c   be set. It coul
17350 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c  d then potential
17360 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77  ly.      ** be w
17370 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20  ritten out into 
17380 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17390 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75  e before its jou
173a0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
173b0 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79  ** segment is sy
173c0 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68  nced. If a crash
173d0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f   occurs during o
173e0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  r following this
173f0 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  ,.      ** datab
17400 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  ase corruption m
17410 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20  ay ensue..      
17420 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
17430 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17440 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73  ager) );.      s
17450 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
17460 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
17470 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
17480 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
17490 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
174a0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
174b0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
174c0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
174d0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
174e0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
174f0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
17500 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
17510 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
17520 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
17530 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
17540 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
17550 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
17560 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
17570 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
17580 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17590 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
175a0 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
175b0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
175c0 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
175d0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
175e0 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
175f0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
17600 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
17610 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
17620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17630 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
17640 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
17650 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
17660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
17670 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
17680 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
17690 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
176a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
176b0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
176c0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
176d0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
176e0 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
176f0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
17700 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17710 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
17720 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
17730 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
17740 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
17750 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
17760 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
17770 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
17780 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
17790 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
177a0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
177b0 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
177c0 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
177d0 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
177e0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
177f0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
17800 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
17810 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
17820 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
17830 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
17840 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
17850 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
17860 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
17870 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
17880 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
17890 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
178a0 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
178b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
178c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
178d0 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
178e0 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
178f0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
17900 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
17910 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
17920 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
17930 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
17940 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
17950 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
17960 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
17970 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
17980 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
17990 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
179a0 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
179b0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
179c0 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
179d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
179e0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
179f0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
17a00 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
17a10 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
17a20 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
17a30 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
17a40 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
17a50 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
17a60 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
17a70 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17a80 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
17a90 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
17aa0 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17ab0 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
17ac0 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
17ad0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
17ae0 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
17af0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
17b00 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
17b10 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
17b20 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
17b30 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
17b40 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
17b50 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
17b60 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
17b70 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
17b80 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
17b90 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
17ba0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
17bb0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
17bc0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
17bd0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
17be0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
17bf0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
17c00 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
17c10 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
17c20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
17c30 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
17c40 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
17c50 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
17c60 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
17c70 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
17c80 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
17c90 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
17ca0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
17cb0 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
17cc0 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
17cd0 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
17ce0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
17cf0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
17d00 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
17d10 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
17d20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
17d30 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
17d40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
17d50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17d60 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
17d70 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
17d80 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
17d90 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
17da0 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
17db0 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
17dc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
17dd0 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
17de0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
17df0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
17e00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
17e10 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
17e20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e40 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17e50 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
17e60 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
17e70 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
17e80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
17e90 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
17ea0 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
17eb0 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
17ec0 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
17ed0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17ee0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
17ef0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
17f00 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
17f10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17f20 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
17f30 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
17f40 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
17f50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17f60 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
17f70 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
17f80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
17f90 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
17fa0 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
17fb0 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
17fc0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
17fd0 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
17fe0 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
17ff0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
18000 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
18010 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
18020 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
18030 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
18040 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
18050 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
18060 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
18070 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
18080 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
18090 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
180a0 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
180b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
180c0 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
180d0 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
180e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
180f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
18100 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
18110 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
18120 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
18130 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
18140 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
18150 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
18160 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
18170 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18180 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
18190 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
181a0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
181b0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
181c0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
181d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
181e0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
181f0 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
18200 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
18210 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18220 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
18230 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
18240 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
18250 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18260 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
18270 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
18280 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
18290 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
182a0 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
182b0 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
182c0 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
182d0 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
182e0 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
182f0 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
18300 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
18310 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
18320 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
18330 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
18340 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
18350 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
18360 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
18370 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
18380 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18390 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
183a0 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
183b0 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
183c0 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
183d0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
183e0 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e  te3Malloc((int)n
183f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
18400 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b  nMasterPtr + 1);
18410 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a  .  if( !zMasterJ
18420 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63  ournal ){.    rc
18430 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18440 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
18450 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
18460 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
18470 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
18480 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
18490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
184a0 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
184b0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
184c0 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
184d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
184e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
184f0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18500 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
18510 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
18520 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
18530 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
18540 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
18550 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
18560 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
18570 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
18580 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
18590 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
185a0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
185b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
185c0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
185d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
185e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
185f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18600 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
18610 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
18620 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
18630 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
18640 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
18650 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
18660 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
18670 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
18680 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
18690 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
186a0 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
186b0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
186c0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
186d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
186e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
186f0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
18700 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
18710 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
18720 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
18730 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
18740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18750 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
18760 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
18770 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
18780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18790 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
187a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
187b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
187c0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
187d0 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
187e0 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
187f0 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
18800 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18810 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
18820 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18830 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18840 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18850 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18860 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
18870 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
18880 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
18890 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
188a0 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
188b0 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
188c0 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
188d0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
188e0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
188f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18900 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18910 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
18920 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
18930 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
18940 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
18950 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18960 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
18970 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
18980 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
18990 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
189a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
189b0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
189c0 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
189d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
189e0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
189f0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
18a00 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
18a10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18a20 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
18a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
18a40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
18a50 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
18a60 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
18a70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
18a80 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
18a90 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
18aa0 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
18ab0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
18ac0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
18ad0 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
18ae0 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
18af0 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
18b00 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
18b10 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
18b20 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
18b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
18b40 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
18b50 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
18b60 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
18b70 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
18b80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
18b90 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
18ba0 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
18bb0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
18bc0 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
18bd0 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
18be0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18bf0 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
18c00 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
18c10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
18c20 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
18c30 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
18c40 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
18c50 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
18c60 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
18c70 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
18c80 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
18c90 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
18ca0 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
18cb0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
18cc0 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
18cd0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
18ce0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
18cf0 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
18d00 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
18d10 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
18d20 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
18d30 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
18d40 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
18d50 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
18d60 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
18d70 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
18d80 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
18d90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
18da0 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
18db0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
18dc0 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
18dd0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
18de0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
18df0 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
18e00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18e10 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
18e20 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
18e30 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
18e40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
18e50 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
18e60 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
18e70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18e80 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
18e90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
18ea0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
18eb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18ec0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
18ed0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
18ee0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
18ef0 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
18f00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
18f10 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
18f20 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
18f30 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
18f40 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
18f50 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
18f60 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
18f70 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
18f80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
18f90 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
18fa0 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
18fb0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
18fc0 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
18fd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
18fe0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
18ff0 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
19000 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70  .    newSize = p
19010 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
19020 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
19030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19040 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
19050 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
19060 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
19070 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
19080 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19090 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
190a0 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
190b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
190c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
190d0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
190e0 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e  er->fd, "", 1, n
190f0 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  ewSize-1);.     
19100 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19120 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
19130 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
19140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
19170 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
19180 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
19190 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
191a0 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
191b0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
191c0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
191d0 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
191e0 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
191f0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
19200 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
19210 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
19220 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
19230 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
19240 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
19250 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
19260 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
19270 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
19280 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
19290 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
192a0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
192b0 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
192c0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
192d0 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
192e0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
192f0 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
19300 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
19310 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19320 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
19330 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
19340 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
19350 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
19360 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
19370 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
19380 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
19390 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
193a0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
193b0 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
193c0 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
193d0 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  R_SIZE..*/.stati
193e0 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
193f0 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
19400 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
19410 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19420 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
19430 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
19440 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
19450 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
19460 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
19470 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
19480 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
19490 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
194a0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
194b0 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
194c0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
194d0 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
194e0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
194f0 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
19500 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
19510 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
19520 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
19530 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
19540 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19550 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a  ectorSize<32 ){.
19560 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19570 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
19580 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
19590 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  sectorSize>MAX_S
195a0 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
195b0 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
195c0 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
195d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
195e0 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53  ctorSize = MAX_S
195f0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
19600 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
19610 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
19620 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
19630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19640 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
19650 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
19660 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
19670 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
19680 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
19690 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
196a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
196b0 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
196c0 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
196d0 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
196e0 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
196f0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
19700 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
19710 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
19720 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
19730 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
19740 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
19750 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
19760 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
19770 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
19780 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
19790 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
197a0 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
197b0 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
197c0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
197d0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
197e0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
197f0 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
19800 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
19810 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
19820 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
19830 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19840 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
19850 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
19860 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
19870 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
19880 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
19890 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
198a0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
198b0 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
198c0 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
198d0 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
198e0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
198f0 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
19900 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
19910 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
19920 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
19930 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
19940 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
19950 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
19960 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
19970 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
19980 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
19990 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
199a0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
199b0 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
199c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
199d0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
199e0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
199f0 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
19a00 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
19a10 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
19a20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
19a30 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
19a40 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
19a50 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
19a60 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
19a70 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
19a80 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
19a90 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
19aa0 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
19ab0 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
19ac0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19ad0 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
19ae0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
19af0 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
19b00 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
19b10 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
19b20 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
19b30 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
19b40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
19b50 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
19b60 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
19b70 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
19b80 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
19b90 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
19ba0 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
19bb0 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
19bc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19bd0 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
19be0 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
19bf0 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
19c00 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
19c10 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
19c20 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
19c30 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
19c40 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
19c50 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
19c60 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
19c70 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
19c80 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
19c90 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
19ca0 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
19cb0 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
19cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
19cd0 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
19ce0 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
19cf0 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
19d00 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
19d10 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
19d20 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
19d30 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
19d40 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
19d50 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
19d60 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
19d70 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
19d80 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
19d90 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
19da0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
19db0 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
19dc0 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
19dd0 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
19de0 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
19df0 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
19e00 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
19e10 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
19e20 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
19e30 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
19e40 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
19e50 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
19e60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
19e70 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
19e80 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
19e90 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
19ea0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
19eb0 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
19ec0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
19ed0 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
19ee0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
19ef0 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
19f00 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
19f10 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
19f20 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
19f30 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
19f40 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
19f50 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
19f60 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
19f70 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
19f80 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
19f90 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
19fa0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
19fb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
19fc0 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
19fd0 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
19fe0 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
19ff0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1a000 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1a010 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1a020 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1a030 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1a040 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1a050 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1a060 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1a070 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1a080 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1a090 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1a0a0 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1a0b0 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1a0c0 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1a0d0 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1a0e0 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1a0f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a100 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1a110 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1a120 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1a130 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1a140 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1a150 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1a160 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1a170 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1a180 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a1b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1a1c0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1a1d0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1a1e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a1f0 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1a200 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1a210 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1a220 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1a230 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1a240 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1a250 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1a260 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1a270 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1a280 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1a2b0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1a2c0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1a2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1a2e0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1a2f0 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1a300 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1a310 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1a320 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1a330 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a340 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1a350 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1a360 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1a370 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1a380 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1a390 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
1a3a0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1a3b0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
1a3c0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1a3d0 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
1a3e0 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
1a3f0 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
1a400 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
1a410 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1a420 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1a430 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1a440 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
1a450 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
1a470 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1a480 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
1a490 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a4a0 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
1a4b0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
1a4c0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
1a4d0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1a4e0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
1a4f0 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
1a500 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
1a510 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
1a520 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
1a530 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
1a540 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
1a550 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
1a560 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
1a570 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
1a580 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
1a590 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
1a5a0 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
1a5b0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
1a5c0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
1a5d0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
1a5e0 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
1a5f0 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
1a600 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
1a610 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
1a620 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1a630 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
1a640 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
1a650 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
1a660 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
1a670 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
1a680 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
1a690 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
1a6a0 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
1a6b0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1a6c0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
1a6d0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1a6e0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1a6f0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1a700 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1a710 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
1a720 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1a730 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
1a740 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1a750 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
1a760 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
1a770 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
1a780 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
1a790 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
1a7a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
1a7b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1a7c0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
1a7d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a7e0 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
1a7f0 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
1a800 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
1a810 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
1a820 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
1a830 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
1a840 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
1a850 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
1a860 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
1a870 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
1a880 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
1a890 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
1a8a0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
1a8b0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
1a8c0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
1a8d0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
1a8e0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
1a8f0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
1a900 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
1a910 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1a920 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
1a930 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
1a940 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
1a950 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
1a960 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61  ess must have fa
1a970 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
1a980 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
1a990 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
1a9a0 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
1a9b0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1a9c0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
1a9d0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
1a9e0 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
1a9f0 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
1aa00 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1aa10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
1aa20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1aa30 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1aa40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1aa50 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1aa60 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1aa70 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
1aa80 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
1aa90 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
1aaa0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
1aab0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1aac0 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
1aad0 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1aae0 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
1aaf0 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
1ab00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1ab10 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
1ab20 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
1ab30 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
1ab40 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
1ab50 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
1ab60 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1ab70 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
1ab80 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
1ab90 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1aba0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
1abb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1abc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1abd0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1abe0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
1abf0 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1ac00 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
1ac10 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
1ac20 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1ac30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1ac40 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
1ac50 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
1ac60 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
1ac70 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
1ac80 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1ac90 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
1aca0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
1acb0 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
1acc0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
1acd0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
1ace0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
1acf0 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1ad00 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
1ad10 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
1ad20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
1ad30 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
1ad40 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1ad50 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
1ad60 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
1ad70 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
1ad80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1ad90 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
1ada0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
1adb0 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
1adc0 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
1add0 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
1ade0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
1adf0 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
1ae00 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
1ae10 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
1ae20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
1ae30 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
1ae40 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
1ae50 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
1ae60 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
1ae70 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
1ae80 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
1ae90 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
1aea0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
1aeb0 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
1aec0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1aed0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
1aee0 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
1aef0 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
1af00 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1af10 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1af20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1af30 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
1af40 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
1af50 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
1af60 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
1af70 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1af80 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
1af90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1afa0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1afb0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1afc0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1afd0 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
1afe0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1aff0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1b000 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
1b010 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1b020 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1b030 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1b040 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
1b050 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1b060 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1b070 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1b080 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
1b090 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
1b0a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1b0b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1b0c0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1b0d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1b0e0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
1b0f0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
1b100 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1b110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b120 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1b130 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1b140 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1b150 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
1b160 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
1b170 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
1b180 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
1b190 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
1b1a0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
1b1b0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
1b1c0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
1b1d0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
1b1e0 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
1b1f0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
1b200 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
1b210 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
1b220 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1b230 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1b240 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1b250 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1b260 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1b270 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
1b280 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
1b290 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1b2a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b2b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b2c0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1b2d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b2e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1b2f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b300 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1b310 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b320 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1b330 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1b340 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1b350 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1b360 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1b370 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1b380 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1b390 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1b3a0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1b3b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1b3c0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1b3d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1b3e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1b3f0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1b400 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1b410 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1b420 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1b430 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1b440 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1b450 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1b460 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1b470 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1b480 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1b490 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1b4a0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1b4b0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1b4c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b4d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1b4e0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b4f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b500 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1b510 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1b520 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1b530 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1b540 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1b550 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1b560 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1b570 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1b580 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1b590 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1b5a0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1b5b0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1b5c0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1b5d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1b5e0 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1b5f0 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1b600 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1b610 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1b620 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1b630 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b640 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1b650 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1b660 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1b670 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1b680 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1b690 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1b6a0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1b6b0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1b6c0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1b6d0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1b6e0 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1b6f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1b700 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1b710 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1b720 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1b730 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1b740 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1b750 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1b760 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1b770 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b780 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1b790 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  fied..  */.  ass
1b7a0 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d  ert(.    pPager-
1b7b0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30  >fd->pMethods==0
1b7c0 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ||.    sqlite3O
1b7d0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
1b7e0 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
1b7f0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1b800 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a  D,0)>=SQLITE_OK.
1b810 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68    );..  /* If th
1b820 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1b830 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1b840 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1b850 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1b860 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1b870 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1b880 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1b890 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1b8a0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1b8b0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1b8c0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1b8d0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1b8e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1b8f0 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1b900 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1b910 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1b920 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1b930 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1b940 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1b950 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1b960 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1b970 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1b980 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1b990 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1b9a0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1b9b0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1b9c0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1b9d0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1b9e0 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1b9f0 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1ba00 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1ba10 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1ba20 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1ba30 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1ba40 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1ba50 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1ba60 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1ba70 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1ba80 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1ba90 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1baa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1bab0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1bac0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1bad0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1bae0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1baf0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1bb00 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1bb10 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1bb20 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1bb30 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1bb40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bb50 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
1bb60 79 6e 63 20 0a 20 20 20 26 26 20 28 70 50 61 67  ync .   && (pPag
1bb70 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1bb80 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1bb90 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1bba0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
1bbb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1bbc0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1bbd0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
1bbe0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
1bbf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bc00 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1bc10 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1bc20 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
1bc30 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
1bc40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1bc50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1bc60 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1bc70 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1bc80 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
1bc90 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1bca0 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
1bcb0 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
1bcc0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1bcd0 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
1bce0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
1bcf0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
1bd00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1bd10 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
1bd20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
1bd30 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
1bd40 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
1bd50 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1bd60 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
1bd70 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
1bd80 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
1bd90 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
1bda0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
1bdb0 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
1bdc0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
1bdd0 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
1bde0 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
1bdf0 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
1be00 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
1be10 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
1be20 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
1be30 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
1be40 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
1be50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1be60 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
1be70 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
1be80 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1be90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bea0 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67  and into .** pPg
1beb0 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65  ->pData. A share
1bec0 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  d lock or greate
1bed0 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  r must be held o
1bee0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
1bef0 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
1bf00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1bf10 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
1bf20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20  page 1 is read, 
1bf30 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
1bf40 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
1bf50 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a  rs[] is set to.*
1bf60 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
1bf70 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1bf80 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1bf90 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1bfa0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49  curs, then the I
1bfb0 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  O error is retur
1bfc0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1bfd0 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  r..** Otherwise,
1bfe0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1bff0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1c000 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
1c010 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1c020 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1c030 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
1c040 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
1c050 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1c060 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
1c070 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
1c080 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
1c090 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
1c0a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1c0b0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1c0c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1c0d0 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c  */.  int isInWal
1c0e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c0f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67    /* True if pag
1c100 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65  e is in log file
1c110 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
1c120 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c130 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
1c140 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
1c150 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1c160 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1c170 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d  R_READER && !MEM
1c180 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1c190 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c1a0 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  d) );..  if( NEV
1c1b0 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65  ER(!isOpen(pPage
1c1c0 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61  r->fd)) ){.    a
1c1d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
1c1e0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d  empFile );.    m
1c1f0 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
1c200 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
1c210 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75  eSize);.    retu
1c220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c230 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
1c240 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
1c250 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1c260 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1c270 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1c280 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1c290 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1c2a0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1c2b0 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70  gno, &isInWal, p
1c2c0 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
1c2d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1c2e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73  SQLITE_OK && !is
1c2f0 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34  InWal ){.    i64
1c300 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
1c310 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1c320 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
1c330 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1c340 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
1c350 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20  g->pData, pgsz, 
1c360 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
1c370 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1c380 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1c390 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c3a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1c3b0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
1c3c0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
1c3d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1c3e0 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
1c3f0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
1c400 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
1c410 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
1c420 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
1c430 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
1c440 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
1c450 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
1c460 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
1c470 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
1c480 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
1c490 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
1c4a0 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
1c4b0 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
1c4c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1c4d0 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
1c4e0 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
1c4f0 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
1c500 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
1c510 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
1c520 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
1c530 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
1c540 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
1c550 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
1c560 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
1c570 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
1c580 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1c590 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
1c5a0 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
1c5b0 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
1c5c0 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
1c5d0 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
1c5e0 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1c5f0 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
1c600 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
1c610 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
1c620 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
1c630 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ing equaling 16 
1c640 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
1c650 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1c660 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
1c670 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
1c680 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
1c690 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
1c6a0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1c6b0 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
1c6c0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1c6d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c6e0 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
1c6f0 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
1c700 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
1c710 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1c720 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1c730 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1c740 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1c750 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
1c760 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1c770 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
1c780 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
1c790 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50  ITE_NOMEM);..  P
1c7a0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1c7b0 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
1c7c0 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
1c7d0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
1c7e0 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
1c7f0 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
1c800 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1c810 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
1c820 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1c830 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1c850 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1c860 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1c870 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
1c880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1c890 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c8a0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1c8b0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1c8c0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1c8d0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1c8e0 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1c8f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1c900 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1c910 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1c920 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1c930 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1c940 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1c950 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1c960 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1c970 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1c980 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1c990 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1c9a0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1c9b0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1c9c0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1c9d0 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1c9e0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1c9f0 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1ca00 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1ca10 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1ca20 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1ca30 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1ca40 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1ca50 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1ca60 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1ca70 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1ca80 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1ca90 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1caa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1cab0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1cac0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1cad0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1cae0 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1caf0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1cb00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1cb10 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1cb20 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1cb30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1cb40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1cb50 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1cb60 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1cb70 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
1cb80 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1cb90 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1cba0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1cbb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1cbc0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1cbd0 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1cbe0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1cbf0 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1cc00 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1cc10 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
1cc20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1cc30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cc40 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1cc50 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
1cc60 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1cc70 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1cc80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1cc90 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1cca0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ccb0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1ccc0 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1ccd0 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1cce0 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1ccf0 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1cd00 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1cd10 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1cd20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1cd30 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1cd40 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1cd50 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1cd60 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1cd70 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1cd80 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1cd90 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1cda0 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1cdb0 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1cdc0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1cdd0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1cde0 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1cdf0 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1ce00 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1ce10 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1ce20 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1ce30 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1ce40 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1ce50 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1ce60 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1ce70 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1ce80 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1ce90 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1cea0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ceb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1cec0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1ced0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1cee0 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1cef0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1cf00 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1cf10 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1cf20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cf40 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1cf50 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf70 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1cf80 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1cf90 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1cfa0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1cfb0 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1cfc0 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1cfd0 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1cfe0 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1cff0 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1d000 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1d010 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1d020 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1d030 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1d040 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1d050 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1d060 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1d070 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1d080 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1d090 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1d0a0 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1d0b0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1d0c0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1d0d0 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1d0e0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1d0f0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1d100 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1d110 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1d120 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1d130 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1d140 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1d150 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1d160 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1d170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1d180 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1d190 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1d1a0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1d1b0 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1d1c0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1d1d0 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1d1e0 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1d1f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d200 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d210 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1d220 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1d230 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1d240 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1d250 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d260 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1d270 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1d280 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1d290 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1d2a0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1d2b0 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1d2c0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1d2d0 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1d2e0 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1d2f0 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
1d300 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
1d310 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1d340 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1d350 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1d360 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1d370 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
1d380 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
1d390 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1d3a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1d3b0 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
1d3c0 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1d3d0 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20  isCommit,       
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d3f0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1d400 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
1d410 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20   sync_flags     
1d420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d430 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
1d440 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29   OsSync() (or 0)
1d450 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d470 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1d480 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
1d490 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
1d4a0 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  al );.  rc = sql
1d4b0 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
1d4c0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
1d4d0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
1d4e0 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
1d4f0 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
1d500 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b   sync_flags.  );
1d510 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d520 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
1d530 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
1d540 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
1d550 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1d560 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1d570 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1d580 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1d590 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1d5a0 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1d5b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d5c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d5d0 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1d5e0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1d5f0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1d600 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1d610 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1d620 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1d630 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1d640 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1d650 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1d660 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1d670 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1d680 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1d690 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1d6a0 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1d6b0 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1d6c0 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1d6d0 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1d6e0 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1d6f0 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1d700 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1d710 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1d720 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1d730 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1d740 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d760 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1d770 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1d780 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d790 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1d7a0 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1d7b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1d7c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1d7d0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1d7e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1d7f0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1d800 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1d810 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1d820 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1d830 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1d840 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1d850 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1d860 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1d870 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1d880 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1d890 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1d8a0 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1d8b0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1d8c0 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1d8d0 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1d8e0 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1d8f0 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1d900 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1d910 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1d920 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1d930 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1d940 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1d950 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1d960 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1d970 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1d980 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
1d990 4c 49 54 45 5f 4f 4b 20 26 26 20 63 68 61 6e 67  LITE_OK && chang
1d9a0 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1d9b0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1d9c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1d9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d9e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d9f0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1da00 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1da10 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74   PAGER_OPEN.** t
1da20 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
1da30 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  tate to determin
1da40 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1da50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1da60 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73  ** in pages (ass
1da70 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  uming the page s
1da80 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ize currently st
1da90 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61  ored in Pager.pa
1daa0 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  geSize)..**.** I
1dab0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1dac0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1dad0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1dae0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1daf0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65  abase.** in page
1db00 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  s is stored in *
1db10 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73  pnPage. Otherwis
1db20 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
1db30 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c   (perhaps.** SQL
1db40 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
1db50 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1db60 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
1db70 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
1db80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1db90 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1dba0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70  *pPager, Pgno *p
1dbb0 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1dbc0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1dbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1dbe0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
1dbf0 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
1dc00 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20  * Query the WAL 
1dc10 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  sub-system for t
1dc20 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1dc30 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28  . The WalDbsize(
1dc40 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ).  ** function 
1dc50 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  returns zero if 
1dc60 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f  the WAL is not o
1dc70 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e  pen (i.e. Pager.
1dc80 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  pWal==0), or.  *
1dc90 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1dca0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76  e size is not av
1dcb0 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74  ailable. The dat
1dcc0 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1dcd0 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  t.  ** available
1dce0 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1dcf0 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20  b-system if the 
1dd00 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74  log file is empt
1dd10 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  y or.  ** contai
1dd20 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d  ns no valid comm
1dd30 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
1dd40 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ns..  */.  asser
1dd50 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1dd60 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1dd70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1dd80 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1dd90 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
1dda0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20  >noReadlock );. 
1ddb0 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
1ddc0 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
1ddd0 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49  ->pWal);..  /* I
1dde0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1ddf0 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69  ize was not avai
1de00 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1de10 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20  AL sub-system,. 
1de20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74   ** determine it
1de30 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
1de40 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1de50 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
1de60 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
1de70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1de80 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
1de90 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1dea0 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a   page-size,.  **
1deb0 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74   round down to t
1dec0 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e  he nearest page.
1ded0 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
1dee0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a  e larger than 0.
1def0 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
1df00 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
1df10 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c   to contain at l
1df20 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20  east one page.. 
1df30 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   */.  if( nPage=
1df40 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20  =0 ){.    i64 n 
1df50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1df60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1df70 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79  of db file in by
1df80 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  tes */.    asser
1df90 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1dfa0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1dfb0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1dfc0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1dfd0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
1dfe0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1dff0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1e000 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
1e010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e030 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e040 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61   }.    }.    nPa
1e050 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20  ge = (Pgno)(n / 
1e060 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e070 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  );.    if( nPage
1e080 3d 3d 30 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20  ==0 && n>0 ){.  
1e090 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1e0a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1e0b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
1e0c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1e0d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
1e0e0 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
1e0f0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1e100 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1e110 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1e120 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1e130 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1e140 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1e150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1e160 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1e170 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1e180 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1e190 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
1e1a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1e1b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e1c0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  K;.}.../*.** Che
1e1d0 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
1e1e0 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
1e1f0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
1e200 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1e210 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
1e220 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1e230 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
1e240 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1e250 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
1e260 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
1e270 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
1e280 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e290 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
1e2a0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
1e2b0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
1e2c0 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
1e2d0 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
1e2e0 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
1e2f0 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
1e300 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
1e310 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
1e320 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
1e330 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
1e340 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
1e350 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
1e360 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
1e370 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
1e380 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
1e390 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1e3a0 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
1e3b0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
1e3c0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
1e3d0 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
1e3e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e3f0 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
1e400 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
1e410 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
1e420 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1e430 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
1e440 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
1e450 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
1e460 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
1e470 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
1e480 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
1e490 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
1e4a0 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
1e4b0 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
1e4c0 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
1e4d0 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
1e4e0 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
1e4f0 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
1e500 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
1e510 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
1e520 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1e530 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e540 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1e550 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1e560 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1e570 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1e580 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1e590 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  || pPager->noRea
1e5a0 64 6c 6f 63 6b 20 29 3b 0a 0a 20 20 69 66 28 20  dlock );..  if( 
1e5b0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1e5c0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57  e ){.    int isW
1e5d0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1e5e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e5f0 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74  f WAL file exist
1e600 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50  s */.    Pgno nP
1e610 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1e620 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1e630 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e640 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d  ile */..    rc =
1e650 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1e660 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1e670 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1e680 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
1e690 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1e6a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1e6b0 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
1e6c0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
1e6d0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 73  al, 0);.      is
1e6e0 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Wal = 0;.    }el
1e6f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1e700 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
1e710 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1e720 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
1e730 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
1e740 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
1e750 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  al.      );.    
1e760 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1e770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e780 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
1e790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e7a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1e7b0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
1e7c0 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
1e7d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e7e0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
1e7f0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
1e800 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
1e810 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1e820 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1e830 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
1e840 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1e850 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
1e860 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
1e870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e880 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e890 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e8a0 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
1e8b0 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
1e8c0 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
1e8d0 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
1e8e0 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
1e8f0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
1e900 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
1e910 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
1e920 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
1e930 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
1e940 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
1e950 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
1e960 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
1e970 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
1e980 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
1e990 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
1e9a0 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
1e9b0 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
1e9c0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1e9d0 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
1e9e0 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
1e9f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
1ea00 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
1ea10 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
1ea20 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
1ea30 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
1ea40 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
1ea50 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
1ea60 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
1ea70 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
1ea80 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
1ea90 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
1eaa0 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
1eab0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
1eac0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
1ead0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1eae0 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
1eaf0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1eb00 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
1eb10 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
1eb20 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
1eb30 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
1eb40 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
1eb50 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
1eb60 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
1eb70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
1eb80 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
1eb90 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
1eba0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
1ebb0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
1ebc0 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
1ebd0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1ebe0 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
1ebf0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1ec00 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
1ec10 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
1ec20 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
1ec30 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
1ec40 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
1ec50 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
1ec60 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
1ec70 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
1ec80 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
1ec90 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
1eca0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
1ecb0 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
1ecc0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
1ecd0 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
1ece0 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
1ecf0 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
1ed00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
1ed10 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
1ed20 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
1ed30 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
1ed40 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
1ed50 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
1ed60 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
1ed70 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
1ed80 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
1ed90 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
1eda0 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
1edb0 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
1edc0 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
1edd0 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
1ede0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
1edf0 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
1ee00 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
1ee10 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
1ee20 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
1ee30 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
1ee40 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
1ee50 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
1ee60 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
1ee70 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
1ee80 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
1ee90 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
1eea0 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
1eeb0 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
1eec0 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
1eed0 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
1eee0 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
1eef0 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
1ef00 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
1ef10 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1ef20 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
1ef30 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
1ef40 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
1ef50 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
1ef60 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
1ef70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
1ef80 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
1ef90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1efa0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
1efb0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
1efc0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1efd0 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
1efe0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
1eff0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
1f000 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
1f010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
1f020 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
1f030 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
1f040 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
1f050 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f060 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
1f070 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
1f080 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
1f090 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
1f0a0 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
1f0b0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
1f0c0 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
1f0d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f0e0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
1f0f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f100 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1f110 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
1f120 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
1f130 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
1f140 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
1f150 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
1f160 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
1f170 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
1f180 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
1f190 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
1f1a0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
1f1b0 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
1f1c0 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
1f1d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f1e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f1f0 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
1f200 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
1f210 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
1f220 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
1f230 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
1f240 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
1f250 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
1f260 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
1f270 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
1f280 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
1f290 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1f2a0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
1f2b0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
1f2c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
1f2d0 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
1f2e0 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
1f2f0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1f300 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
1f310 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
1f320 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
1f330 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f340 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
1f350 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
1f360 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
1f370 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
1f380 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
1f390 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
1f3a0 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
1f3b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1f3c0 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
1f3d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1f3e0 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
1f3f0 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
1f400 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f410 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
1f420 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
1f430 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
1f440 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
1f450 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1f460 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
1f470 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
1f480 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
1f490 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
1f4a0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1f4b0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
1f4c0 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
1f4d0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
1f4e0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
1f4f0 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1f500 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
1f510 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
1f520 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
1f530 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
1f540 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
1f550 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
1f560 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
1f570 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
1f580 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
1f590 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
1f5a0 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
1f5b0 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
1f5c0 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
1f5d0 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
1f5e0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
1f5f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
1f600 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
1f610 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1f620 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
1f630 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
1f640 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
1f650 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
1f660 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
1f670 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
1f680 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
1f690 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
1f6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f6b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f6c0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
1f6d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1f6e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1f6f0 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
1f700 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
1f710 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
1f720 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
1f730 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1f740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1f750 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1f760 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1f770 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
1f780 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
1f790 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
1f7a0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
1f7b0 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
1f7c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1f7d0 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
1f7e0 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
1f7f0 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
1f800 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1f810 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
1f820 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
1f830 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
1f840 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
1f850 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
1f860 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
1f870 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
1f880 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1f890 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1f8a0 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
1f8b0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
1f8c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f8d0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
1f8e0 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
1f8f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
1f900 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
1f910 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1f920 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1f930 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
1f940 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
1f950 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
1f960 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
1f970 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
1f980 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
1f990 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
1f9a0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1f9b0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
1f9c0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
1f9d0 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
1f9e0 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
1f9f0 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
1fa00 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
1fa10 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
1fa20 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
1fa30 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1fa40 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
1fa50 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
1fa60 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
1fa70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
1fa80 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1fa90 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
1faa0 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
1fab0 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
1fac0 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
1fad0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
1fae0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
1faf0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
1fb00 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
1fb10 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
1fb20 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
1fb30 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
1fb40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
1fb50 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1fb60 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1fb70 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
1fb80 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
1fb90 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1fba0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1fbb0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
1fbc0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1fbd0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
1fbe0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
1fbf0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
1fc00 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
1fc10 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
1fc20 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
1fc30 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
1fc40 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
1fc50 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
1fc60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
1fc70 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
1fc80 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
1fc90 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
1fca0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
1fcb0 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
1fcc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
1fcd0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
1fce0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
1fcf0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1fd00 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
1fd10 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  et = pSavepoint-
1fd20 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >iSubRec*(4+pPag
1fd30 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
1fd40 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
1fd50 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1fd60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fd70 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64  3WalSavepointUnd
1fd80 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
1fd90 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c  pSavepoint->aWal
1fda0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
1fdb0 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
1fdc0 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
1fdd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
1fde0 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
1fdf0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
1fe00 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69  ssert( offset==i
1fe10 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
1fe20 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
1fe30 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1fe40 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1fe50 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
1fe60 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
1fe70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
1fe80 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1fe90 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
1fea0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
1feb0 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
1fec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fed0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fee0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
1fef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ff00 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1ff10 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
1ff20 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
1ff30 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
1ff40 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1ff50 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
1ff60 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
1ff70 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
1ff80 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1ff90 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
1ffa0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
1ffb0 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
1ffc0 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
1ffd0 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
1ffe0 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
1fff0 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
20000 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
20010 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
20020 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
20030 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
20040 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
20050 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
20060 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
20070 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
20080 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
20090 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
200a0 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
200b0 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
200c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
200d0 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
200e0 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
200f0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
20100 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
20110 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
20120 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
20130 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
20150 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
20160 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
20170 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
20180 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
20190 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
201a0 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
201b0 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
201c0 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
201d0 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
201e0 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
201f0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
20200 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
20210 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20220 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
20230 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
20240 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
20250 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
20260 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
20270 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
20280 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
20290 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
202a0 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
202b0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
202c0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
202d0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
202e0 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
202f0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
20300 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
20310 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
20320 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
20330 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
20340 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
20350 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
20360 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
20370 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
20380 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
20390 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
203a0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
203b0 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
203c0 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
203d0 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
203e0 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
203f0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
20400 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
20410 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
20430 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
20440 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
20450 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
20460 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
20470 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
20480 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
20490 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
204a0 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
204b0 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
204c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
204d0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
204e0 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
204f0 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
20500 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
20510 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
20520 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20   bFullFsync){.  
20530 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
20540 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
20550 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
20560 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
20570 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
20580 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
20590 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
205a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
205b0 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46  _flags = (bFullF
205c0 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
205d0 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
205e0 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 7d 0a 23 65 6e  C_NORMAL);.}.#en
205f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
20600 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
20610 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
20620 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
20630 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
20640 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
20650 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
20660 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
20670 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
20680 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
20690 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
206a0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
206b0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
206c0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
206d0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
206e0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
206f0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
20700 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
20710 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
20720 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
20730 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
20740 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
20750 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
20760 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
20770 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
20780 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
20790 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
207a0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
207b0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
207c0 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
207d0 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
207e0 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
207f0 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
20800 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
20810 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
20820 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
20830 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
20840 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
20850 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
20860 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
20870 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
20880 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
20890 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
208a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
208b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
208c0 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
208d0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
208e0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
208f0 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
20900 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
20910 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
20920 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
20930 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
20940 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
20950 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
20960 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
20970 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20990 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
209a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
209b0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
209c0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
209d0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
209e0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
209f0 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
20a00 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
20a10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
20a20 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
20a30 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
20a40 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20a50 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
20a60 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
20a70 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
20a80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
20a90 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
20aa0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
20ab0 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
20ac0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20ad0 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
20ae0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
20af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
20b00 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
20b10 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
20b20 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
20b30 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
20b40 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
20b50 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
20b60 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
20b70 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
20b80 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
20b90 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
20ba0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
20bb0 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
20bc0 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
20bd0 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
20be0 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
20bf0 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
20c00 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
20c10 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
20c20 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
20c30 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
20c40 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
20c50 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
20c60 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
20c70 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
20c80 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
20c90 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
20ca0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
20cb0 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
20cd0 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
20ce0 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
20cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
20d30 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
20d40 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
20d50 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
20d60 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
20d70 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
20d80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
20d90 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
20da0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
20db0 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
20dc0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
20dd0 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
20de0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
20df0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
20e00 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
20e10 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
20e20 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
20e30 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
20e40 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
20e50 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
20e60 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
20e70 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
20e80 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
20e90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
20ea0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
20eb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
20ee0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
20ef0 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
20f00 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
20f10 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
20f20 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
20f30 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
20f40 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
20f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20f60 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
20f70 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
20f80 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
20f90 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
20fa0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
20fb0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
20fc0 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
20fd0 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
20fe0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
20ff0 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
21000 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
21010 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
21020 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
21030 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
21040 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
21050 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
21060 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
21070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
21080 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
21090 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
210a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
210b0 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
210c0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
210d0 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
210e0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
210f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
21100 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
21110 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
21120 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
21130 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
21140 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
21150 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
21160 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
21170 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
21180 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
21190 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
211a0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
211b0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
211c0 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
211d0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
211e0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
211f0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
21200 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
21210 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
21220 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
21230 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
21240 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
21250 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
21260 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
21270 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
21280 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
21290 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
212a0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
212b0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
212c0 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
212d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
212e0 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
212f0 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
21300 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
21310 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
21320 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
21330 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
21340 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
21350 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
21360 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
21370 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
21380 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
21390 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
213a0 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
213b0 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
213c0 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
213d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
213e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
213f0 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
21400 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
21410 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
21420 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
21430 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
21440 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
21450 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
21460 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
21470 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
21480 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
21490 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
214a0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
214b0 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
214c0 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
214d0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
214e0 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
214f0 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
21500 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
21510 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21520 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
21530 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
21540 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
21550 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
21560 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
21570 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
21580 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
21590 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
215a0 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
215b0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
215c0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
215d0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
215e0 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
215f0 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
21600 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
21610 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
21620 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
21630 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
21640 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
21650 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
21660 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
21670 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
21680 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
21690 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
216a0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
216b0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
216c0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
216d0 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
216e0 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
216f0 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
21700 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
21710 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
21720 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
21730 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
21740 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
21750 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
21760 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
21770 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
21780 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
21790 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
217a0 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
217b0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
217c0 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
217d0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
217e0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
217f0 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
21800 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
21810 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
21820 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
21830 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
21840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21850 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
21860 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
21870 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
21880 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
21890 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
218a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
218b0 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
218c0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
218d0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
218e0 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
218f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
21910 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
21920 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
21930 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
21940 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
21950 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21960 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
21970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21980 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
21990 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
219a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
219b0 6e 42 79 74 65 2f 70 61 67 65 53 69 7a 65 3b 0a  nByte/pageSize;.
219c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
219d0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
219e0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
219f0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
21a00 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
21a10 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
21a20 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
21a30 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
21a40 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
21a50 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
21a60 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
21a70 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20  }..  *pPageSize 
21a80 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
21a90 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ze;.  if( rc==SQ
21aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
21ab0 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
21ac0 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
21ad0 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
21ae0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
21af0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
21b00 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
21b10 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
21b20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
21b30 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
21b40 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
21b50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21b60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
21b70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
21b80 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
21b90 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
21ba0 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
21bb0 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
21bc0 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
21bd0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
21be0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
21bf0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
21c00 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
21c10 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
21c20 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
21c30 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
21c40 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
21c50 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
21c60 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
21c70 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
21c80 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
21c90 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
21ca0 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
21cb0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
21cc0 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
21cd0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
21ce0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
21cf0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21d00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
21d10 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
21d20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
21d30 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
21d40 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
21d50 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
21d60 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
21d70 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
21d80 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
21d90 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
21da0 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
21db0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
21dc0 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
21dd0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
21de0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
21df0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
21e00 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
21e10 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
21e20 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
21e30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21e40 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
21e50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21e60 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
21e70 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
21e80 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
21e90 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
21ea0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
21eb0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
21ec0 20 26 26 20 70 50 61 67 65 72 2d 3e 6d 78 50 67   && pPager->mxPg
21ed0 6e 6f 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no<pPager->dbSiz
21ee0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
21ef0 3e 6d 78 50 67 6e 6f 20 3d 20 70 50 61 67 65 72  >mxPgno = pPager
21f00 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ->dbSize;.  }.  
21f10 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
21f20 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
21f30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
21f40 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
21f50 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
21f60 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
21f70 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
21f80 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
21f90 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
21fa0 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
21fb0 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
21fc0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
21fd0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
21fe0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
21ff0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
22000 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
22010 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
22020 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
22030 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
22040 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
22050 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
22060 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
22070 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
22080 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
22090 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
220a0 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
220b0 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
220c0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
220d0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
220e0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
220f0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
22100 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
22110 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
22120 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
22130 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
22140 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
22150 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
22160 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
22170 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
22180 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
22190 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
221a0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
221b0 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
221c0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
221d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
221e0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
221f0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
22200 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
22210 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
22220 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
22230 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
22240 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
22250 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
22260 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
22270 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
22280 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
22290 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
222a0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
222b0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
222c0 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
222d0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
222e0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
222f0 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
22300 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
22310 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
22320 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
22330 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
22340 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
22350 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
22360 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
22370 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
22380 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
22390 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
223a0 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
223b0 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
223c0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
223d0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
223e0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
223f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
22400 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
22410 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22420 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
22430 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
22440 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
22450 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
22460 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
22470 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
22480 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
22490 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
224a0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
224b0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
224c0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
224d0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
224e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
224f0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
22500 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
22510 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
22520 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
22530 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
22540 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
22550 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
22560 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
22570 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
22580 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
22590 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
225a0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
225b0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
225c0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
225d0 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
225e0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
225f0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
22600 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
22610 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
22620 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
22630 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
22640 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
22650 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
22660 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
22670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
22680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22690 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
226a0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
226b0 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74  ed when a read-t
226c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
226d0 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  en on.** the pag
226e0 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  er. It returns t
226f0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
22700 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
22710 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
22720 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
22730 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
22740 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
22750 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
22760 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
22770 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
22780 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76   page file..*/.v
22790 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
227a0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
227b0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
227c0 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
227d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
227e0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
227f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22800 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
22810 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
22820 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
22830 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
22840 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.}.../*.** T
22850 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
22860 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
22870 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
22880 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
22890 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
228a0 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
228b0 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
228c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
228d0 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
228e0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
228f0 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
22900 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
22910 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
22920 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
22930 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
22940 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
22950 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
22960 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
22970 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
22980 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
22990 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
229a0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
229b0 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
229c0 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
229d0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
229e0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
229f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22a00 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
22a10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
22a20 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
22a30 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
22a40 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
22a50 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
22a60 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
22a70 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
22a80 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
22a90 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
22aa0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
22ab0 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
22ac0 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
22ad0 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
22ae0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22b10 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
22b20 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
22b30 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
22b40 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
22b50 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
22b60 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
22b70 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66   held, or one of
22b80 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e   the transistion
22b90 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
22ba0 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
22bb0 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
22bc0 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
22bd0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
22be0 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
22bf0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
22c00 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
22c10 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
22c20 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ock>=locktype). 
22c30 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
22c40 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
22c50 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
22c60 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
22c70 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
22c80 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
22c90 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
22ca0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
22cb0 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20    );..  do {.   
22cc0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
22cd0 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  b(pPager, lockty
22ce0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  pe);.  }while( r
22cf0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
22d00 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
22d10 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
22d20 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
22d30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
22d40 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
22d50 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
22d60 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
22d70 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
22d80 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
22d90 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
22da0 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
22db0 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
22dc0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
22dd0 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
22de0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
22df0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
22e00 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
22e10 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
22e20 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
22e30 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
22e40 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
22e50 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
22e60 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
22e70 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
22e80 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
22e90 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
22ea0 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
22eb0 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
22ec0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
22ed0 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
22ee0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
22ef0 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
22f00 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
22f10 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
22f20 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
22f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
22f40 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
22f50 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
22f60 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
22f70 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
22f80 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
22f90 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
22fa0 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
22fb0 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
22fc0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
22fd0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
22fe0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
22ff0 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
23000 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
23010 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
23020 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
23030 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
23040 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72  orrect behaviour
23050 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
23060 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
23070 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
23080 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
23090 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
230a0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
230b0 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
230c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
230d0 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
230e0 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
230f0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
23100 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
23110 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
23120 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
23130 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
23140 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
23150 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
23160 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
23170 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
23180 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
23190 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
231a0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
231b0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
231c0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
231d0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
231e0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
231f0 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
23200 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
23210 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
23220 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
23230 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
23240 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
23250 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
23260 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
23270 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
23280 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
23290 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
232a0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
232b0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
232c0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
232d0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
232e0 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
232f0 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
23300 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
23310 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
23320 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
23330 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
23340 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
23350 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
23360 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
23370 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
23380 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
23390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
233a0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
233b0 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
233c0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
233d0 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
233e0 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
233f0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
23400 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
23410 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
23420 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
23430 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
23440 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
23450 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
23460 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
23470 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
23480 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
23490 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
234a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
234b0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
234c0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
234d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
234e0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
234f0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
23500 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
23510 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23520 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
23530 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
23540 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
23550 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
23560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
23570 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
23580 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
23590 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
235a0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
235b0 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
235c0 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
235d0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
235e0 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
235f0 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
23600 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
23610 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
23620 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
23630 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
23640 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
23650 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
23660 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
23670 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
23680 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
23690 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
236a0 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
236b0 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
236c0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
236d0 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
236e0 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
236f0 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
23700 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
23710 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
23720 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
23730 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
23740 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
23750 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
23760 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
23770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
23780 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
23790 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
237a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
237b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
237c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
237d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
237e0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
237f0 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
23800 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
23810 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23820 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
23830 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
23840 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
23850 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
23860 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
23880 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
23890 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
238a0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
238b0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
238c0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
238d0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
238e0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
238f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
23900 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
23910 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
23920 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
23930 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
23940 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
23950 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
23960 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
23970 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
23980 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
23990 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
239a0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
239b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
239c0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
239d0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
239e0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
239f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
23a00 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
23a10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
23a20 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
23a30 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
23a40 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
23a50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23a60 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
23a70 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
23a80 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
23a90 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
23aa0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
23ab0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
23ac0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
23ad0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23ae0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
23af0 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
23b00 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
23b10 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
23b20 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
23b30 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
23b40 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
23b50 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
23b60 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
23b70 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
23b80 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
23b90 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
23ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
23bb0 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
23bc0 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
23bd0 2c 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e  ,.    (pPager->n
23be0 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67  oSync ? 0 : pPag
23bf0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c  er->sync_flags),
23c00 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61   .    pPager->pa
23c10 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29  geSize, pTmp.  )
23c20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
23c30 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
23c40 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
23c50 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
23c60 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
23c70 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
23c80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
23c90 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
23ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
23cb0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
23cc0 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
23cd0 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
23ce0 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
23cf0 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
23d00 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
23d10 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
23d20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
23d30 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
23d40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
23d50 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
23d60 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
23d70 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
23d80 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
23d90 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
23da0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
23db0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
23dc0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
23dd0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
23de0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
23df0 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
23e00 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
23e10 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
23e20 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
23e30 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
23e40 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
23e50 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
23e60 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
23e70 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
23e80 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
23e90 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
23ea0 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
23eb0 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
23ec0 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
23ed0 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
23ee0 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
23ef0 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
23f00 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
23f10 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
23f20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
23f30 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
23f40 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
23f50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
23f60 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
23f70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
23f80 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
23f90 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
23fa0 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
23fb0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
23fc0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
23fd0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
23fe0 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
23ff0 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
24000 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
24010 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
24020 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
24030 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
24040 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
24050 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
24060 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
24070 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
24080 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
24090 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
240a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
240b0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
240c0 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
240d0 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
240e0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
240f0 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
24100 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
24110 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
24120 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
24130 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
24140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
24150 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
24160 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
24170 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
24180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24190 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
241a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
241b0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
241c0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
241d0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
241e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
241f0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
24200 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
24210 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
24220 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
24230 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
24240 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
24250 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
24260 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
24270 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
24280 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
24290 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
242a0 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
242b0 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
242c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
242d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
242e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
242f0 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
24300 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
24310 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
24320 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
24330 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
24340 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
24350 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
24360 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
24370 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
24380 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
24390 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
243a0 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
243b0 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  oSync flag is se
243c0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
243d0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
243e0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
243f0 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
24400 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
24410 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
24420 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69  and the .** devi
24430 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
24440 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69  cs of the the fi
24450 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
24460 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
24470 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
24480 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
24490 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
244a0 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
244b0 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
244c0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
244d0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
244e0 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
244f0 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
24500 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
24510 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
24520 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
24530 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
24540 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
24550 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
24560 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
24570 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
24580 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
24590 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
245a0 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
245b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
245c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
245d0 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
245e0 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
245f0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
24600 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
24610 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
24620 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
24630 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
24640 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
24650 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
24660 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
24670 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
24680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
24690 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
246a0 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
246b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
246c0 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
246d0 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
246e0 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
246f0 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
24700 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
24710 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
24720 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
24730 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
24740 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
24750 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
24760 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
24770 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
24780 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
24790 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
247a0 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
247b0 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
247c0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
247d0 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
247e0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
247f0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
24800 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
24810 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
24820 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
24830 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
24840 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
24850 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
24860 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
24870 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
24880 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
24890 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
248a0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
248d0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
248e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
248f0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
24900 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
24910 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
24920 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
24930 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
24940 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
24950 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
24960 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
24970 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
24980 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
24990 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
249a0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
249b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
249c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
249d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
249e0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
249f0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
24a00 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
24a10 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
24a20 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
24a30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
24a40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24a50 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
24a60 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
24a70 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
24a80 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
24a90 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
24aa0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
24ab0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
24ac0 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
24ad0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
24ae0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
24af0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
24b00 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
24b10 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
24b20 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
24b30 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
24b40 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
24b50 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
24b60 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
24b70 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
24b80 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
24b90 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
24ba0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
24bb0 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
24bc0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
24bd0 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
24be0 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
24bf0 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
24c00 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
24c10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
24c20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
24c30 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
24c40 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
24c50 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
24c60 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
24c70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
24c80 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
24c90 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
24ca0 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
24cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
24cc0 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
24cd0 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
24ce0 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
24cf0 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
24d00 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
24d10 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
24d20 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
24d30 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
24d40 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
24d50 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
24d60 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
24d70 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
24d80 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
24d90 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
24da0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
24db0 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
24dc0 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
24dd0 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
24de0 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
24df0 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
24e00 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
24e10 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
24e20 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
24e30 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
24e40 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
24e50 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
24e60 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
24e70 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
24e80 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
24e90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
24ea0 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
24eb0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
24ec0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
24ed0 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
24ee0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
24ef0 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
24f00 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
24f10 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
24f20 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
24f30 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
24f40 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
24f50 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
24f60 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
24f70 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
24f80 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
24f90 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
24fa0 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
24fb0 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
24fc0 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
24fd0 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
24fe0 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
24ff0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
25000 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
25010 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
25020 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
25030 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
25040 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
25050 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
25060 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
25070 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
25080 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
25090 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
250a0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
250b0 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
250c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
250d0 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
250e0 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
250f0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
25100 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
25110 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
25120 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
25130 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
25140 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
25150 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
25160 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
25170 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
25180 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
25190 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
251a0 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
251b0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
251c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
251d0 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
251e0 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
251f0 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
25200 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
25210 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
25220 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
25230 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
25240 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
25250 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
25260 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
25270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25290 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
252a0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
252b0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
252c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
252d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
252e0 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
252f0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
25300 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
25310 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
25320 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
25330 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
25340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
25350 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
25360 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
25370 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
25380 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
25390 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
253a0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
253b0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
253c0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
253d0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
253e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
253f0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
25400 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
25410 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
25420 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
25430 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
25440 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
25450 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
25460 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
25470 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
25480 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
25490 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
254a0 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
254b0 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
254c0 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
254d0 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
254e0 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
254f0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
25500 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
25510 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
25520 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
25530 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
25540 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
25550 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
25560 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
25570 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
25580 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
25590 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
255a0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
255b0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
255c0 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
255d0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
255e0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
255f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25600 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
25610 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
25620 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  c_flags);.      
25630 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25640 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
25650 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
25660 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
25670 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
25680 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
25690 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
256a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
256b0 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
256c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
256d0 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
256e0 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
256f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
25700 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
25710 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25720 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
25730 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
25740 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
25750 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
25760 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
25770 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
25780 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
25790 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
257a0 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
257b0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
257c0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
257d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
257e0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
257f0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
25800 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
25810 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
25820 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
25830 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
25840 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
25850 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
25860 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25870 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
25880 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
25890 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
258a0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
258b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
258c0 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
258d0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
258e0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
258f0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
25900 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
25910 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
25920 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
25930 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
25940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25950 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
25960 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
25970 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
25980 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
25990 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
259a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
259b0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
259c0 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
259d0 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
259e0 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
259f0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
25a00 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
25a10 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
25a20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
25a30 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
25a40 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
25a50 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
25a60 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
25a70 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
25a80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
25a90 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
25aa0 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
25ab0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
25ac0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
25ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
25af0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
25b00 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
25b10 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
25b20 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
25b30 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
25b40 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
25b50 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
25b60 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
25b70 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
25b80 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
25b90 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
25ba0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
25bb0 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
25bc0 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
25bd0 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
25be0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
25bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
25c00 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
25c10 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
25c20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
25c30 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
25c40 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
25c50 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
25c60 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
25c70 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
25c80 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
25c90 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
25ca0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
25cb0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
25cc0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
25cd0 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
25ce0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
25cf0 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
25d00 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
25d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25d20 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
25d30 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
25d40 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
25d50 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
25d60 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
25d70 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
25d80 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
25d90 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
25da0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
25db0 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
25dc0 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
25dd0 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
25de0 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
25df0 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
25e00 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
25e10 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
25e20 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
25e30 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
25e40 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
25e50 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
25e60 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
25e70 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
25e80 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
25e90 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
25ea0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
25eb0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
25ec0 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
25ed0 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
25ee0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
25ef0 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
25f00 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
25f10 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
25f20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
25f30 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
25f40 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
25f50 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
25f60 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
25f70 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
25f80 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
25f90 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
25fa0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
25fb0 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
25fc0 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
25fd0 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
25fe0 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
25ff0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
26000 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
26010 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
26020 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26030 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
26040 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
26050 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
26060 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
26070 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
26080 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
26090 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
260a0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
260b0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
260c0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
260d0 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
260e0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
260f0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
26100 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26120 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
26130 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
26140 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
26150 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
26160 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
26170 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
26180 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
26190 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
261a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
261b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
261c0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
261d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
261e0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
261f0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
26200 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
26210 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
26220 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
26230 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
26240 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
26250 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
26260 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
26270 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
26280 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
26290 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
262a0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
262b0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
262c0 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
262d0 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
262e0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
262f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
26300 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
26310 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
26320 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
26330 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
26340 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
26350 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
26360 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a  .  }..#if 0.  /*
26370 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
26380 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
26390 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
263a0 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
263b0 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
263c0 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
263d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
263e0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
263f0 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
26400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26410 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
26420 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  ze>pPager->dbHin
26430 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  tSize ){.    sql
26440 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
26450 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
26460 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
26470 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
26480 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
26490 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
264a0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
264b0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
264c0 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 7d  T, &szFile);.  }
264d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
264e0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
264f0 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
26500 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
26510 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
26520 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
26530 62 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  be..  */.  if( r
26540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
26550 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
26560 65 3e 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e>(pPager->dbFil
26570 65 53 69 7a 65 2b 31 29 0a 20 20 20 26 26 20 69  eSize+1).   && i
26580 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
26590 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
265a0 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
265b0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
265c0 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
265d0 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
265e0 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
265f0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
26600 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
26610 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
26620 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
26630 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
26640 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
26650 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
26660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26670 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
26680 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
26690 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
266a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
266b0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
266c0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
266d0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
266e0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
266f0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
26700 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
26710 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
26720 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
26730 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
26740 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
26750 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
26760 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
26770 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
26780 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
26790 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
267a0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
267b0 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
267c0 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
267d0 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
267e0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
267f0 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
26800 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
26810 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
26820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26830 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
26840 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
26850 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
26860 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
26870 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
26880 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
26890 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
268a0 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
268b0 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
268c0 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
268f0 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
26900 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
26910 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
26920 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
26930 59 4e 43 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  YNC)==0 );..    
26940 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
26950 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
26960 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
26970 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
26980 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
26990 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
269a0 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
269b0 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
269c0 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
269d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
269e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
269f0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
26a00 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
26a10 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
26a20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
26a30 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
26a40 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
26a50 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
26a60 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
26a70 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
26a80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
26a90 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
26aa0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
26ab0 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
26ac0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
26ad0 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
26ae0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
26af0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
26b00 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
26b10 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
26b20 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
26b30 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
26b40 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
26b50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26b60 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
26b70 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
26b80 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
26b90 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
26ba0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
26bb0 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
26bc0 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
26bd0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
26be0 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
26bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
26c00 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
26c10 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
26c20 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
26c30 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
26c40 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
26c50 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
26c60 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
26c80 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
26c90 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
26ca0 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
26cb0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
26cc0 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
26cd0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
26ce0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
26cf0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
26d00 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
26d10 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
26d20 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
26d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
26d40 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
26d50 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
26d60 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
26d70 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
26d80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
26d90 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
26da0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
26db0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
26dc0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
26dd0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
26de0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
26df0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26e00 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
26e10 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
26e20 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
26e30 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
26e40 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
26e50 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26e60 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
26e70 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26e80 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
26e90 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
26ea0 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
26eb0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
26ec0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26ed0 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
26ee0 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
26ef0 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
26f00 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
26f10 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
26f20 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26f40 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
26f50 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
26f60 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26f70 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
26f80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
26f90 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
26fa0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
26fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
26fc0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
26fd0 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
26fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
26ff0 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
27000 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
27010 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
27020 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
27030 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
27040 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
27050 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
27060 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
27070 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
27080 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
27090 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
270a0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
270b0 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
270c0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
270d0 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
270e0 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
270f0 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
27100 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
27110 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
27120 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
27130 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
27140 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
27150 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
27160 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
27170 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
27180 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
27190 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
271a0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
271b0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
271c0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
271d0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
271e0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
271f0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
27200 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
27210 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
27220 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
27230 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
27240 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
27250 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
27260 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
27270 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
27280 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
27290 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
272a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
272b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
272c0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
272d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
272e0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
272f0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
27300 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
27310 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
27320 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
27330 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
27340 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
27350 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
27360 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
27370 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27380 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
27390 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
273a0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
273b0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
273c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
273d0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
273e0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
273f0 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
27400 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
27410 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
27420 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
27430 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
27440 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
27450 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
27460 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
27470 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
27480 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
27490 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
274a0 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
274b0 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
274c0 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
274d0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
274e0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
274f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27500 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
27510 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
27520 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
27530 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
27540 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
27550 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
27560 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
27570 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
27580 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
27590 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
275a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
275b0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
275c0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
275d0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
275e0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
275f0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
27600 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
27610 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
27620 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
27630 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
27640 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
27650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27670 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
27680 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
27690 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
276a0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
276b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
276c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
276d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
276e0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
276f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
27700 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
27710 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
27720 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
27730 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
27740 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27750 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
27760 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
27770 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
27780 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
27790 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
277a0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
277b0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
277c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
277d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
277e0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
277f0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
27800 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
27810 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
27820 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
27830 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
27840 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
27850 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
27860 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
27870 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
27880 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
27890 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
278a0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
278b0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
278c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
278d0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
278e0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
278f0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
27900 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
27910 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
27920 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
27930 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
27940 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
27950 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
27960 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
27970 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
27980 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
27990 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
279a0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
279b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
279c0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
279d0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
279e0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
279f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
27a00 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
27a10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
27a20 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
27a30 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
27a40 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
27a50 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27a60 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
27a70 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
27a80 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
27a90 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
27aa0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
27ab0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
27ac0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
27ad0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
27ae0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
27af0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
27b00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
27b10 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
27b20 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
27b30 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
27b40 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
27b50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27b60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
27b70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
27b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27b90 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
27ba0 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
27bb0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
27bc0 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
27bd0 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
27be0 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
27bf0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
27c00 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
27c10 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
27c20 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
27c30 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
27c40 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
27c50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
27c60 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
27c70 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
27c80 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
27c90 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
27ca0 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
27cb0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66  The doNotSpill f
27cc0 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  lag inhibits all
27cd0 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20   cache spilling 
27ce0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
27cf0 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
27d00 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
27d10 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
27d20 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  et during a roll
27d30 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
27d40 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
27d50 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
27d60 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
27d70 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
27d80 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
27d90 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
27da0 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
27db0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
27dc0 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73  aton it .  ** is
27dd0 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
27de0 73 71 6c 69 74 65 33 50 43 61 63 68 65 46 65 74  sqlite3PCacheFet
27df0 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65  ch() to be calle
27e00 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  d with createFla
27e10 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20  g==1.  ** while 
27e20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
27e30 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20  te, hence it is 
27e40 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  impossible for t
27e50 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20  his routine to. 
27e60 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e   ** be called in
27e70 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
27e80 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
27e90 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45   we include a NE
27ea0 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20  VER().  ** test 
27eb0 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  for the error st
27ec0 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61  ate as a safegua
27ed0 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72  rd against futur
27ee0 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a  e changes..  */.
27ef0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
27f00 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
27f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27f20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
27f30 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75  oNotSpill ) retu
27f40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
27f50 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
27f60 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70  tSyncSpill && (p
27f70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
27f80 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
27f90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27fa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
27fb0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
27fc0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
27fd0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
27fe0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
27ff0 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
28000 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
28010 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  og. */.    if( s
28020 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
28030 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72  pPg) ){ .      r
28040 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
28050 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a  ge(pPg); .    }.
28060 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
28080 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
28090 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
280a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
280b0 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
280c0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
280d0 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
280e0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
280f0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
28100 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
28110 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
28120 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
28130 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
28140 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
28150 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
28160 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
28170 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
28180 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
28190 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
281a0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
281b0 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  size of.    ** t
281c0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
281d0 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74  e, it may need t
281e0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
281f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
28200 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
28210 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
28220 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
28230 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
28240 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
28250 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
28260 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
28270 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
28280 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e     **.    ** Con
28290 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
282a0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
282b0 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20  events:.    **. 
282c0 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20     **   BEGIN;. 
282d0 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e     **     <journ
282e0 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  al page X>.    *
282f0 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61  *     <modify pa
28300 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
28310 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
28320 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72     **       <shr
28330 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
28340 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
28350 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
28360 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
28370 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41     **     ROLLBA
28380 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a  CK TO sp;.    **
28390 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  .    ** If (X>Y)
283a0 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
283b0 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
283c0 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
283d0 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  t be written.   
283e0 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
283f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
28400 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
28410 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
28420 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66  . Then,.    ** f
28430 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f  ollowing the "RO
28440 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74  LLBACK TO sp" st
28450 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67  atement, reading
28460 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61   page X will rea
28470 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72  d.    ** data fr
28480 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
28490 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
284a0 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
284b0 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20  age X as it.    
284c0 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
284d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
284e0 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
284f0 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
28500 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61  NT sp".    ** wa
28510 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  s executed..    
28520 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
28530 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69  lution is to wri
28540 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  te the current d
28550 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69  ata for page X i
28560 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
28570 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
28580 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
28590 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
285a0 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
285b0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73  ll.    ** be res
285c0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
285d0 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
285e0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
285f0 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20   sp" is .    ** 
28600 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f  executed..    */
28610 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a  .    if( NEVER(.
28620 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
28630 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
28640 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
28650 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
28660 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29  sPage(pPg).    )
28670 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
28680 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
28690 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
286a0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
286b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
286c0 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
286d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
286e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
286f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
28700 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
28710 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
28720 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
28730 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
28740 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
28750 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
28760 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
28770 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
28780 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
28790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
287a0 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
287b0 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
287c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
287d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
287e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
287f0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
28800 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
28810 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
28820 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  , rc);.}.../*.**
28830 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
28840 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
28850 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
28860 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
28870 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
28880 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
28890 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
288a0 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
288b0 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
288c0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
288d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
288e0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
288f0 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
28900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28910 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
28920 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
28930 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
28940 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
28950 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
28960 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
28970 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
28980 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
28990 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
289a0 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
289b0 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
289c0 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
289d0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
289e0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
289f0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
28a00 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
28a10 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
28a20 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
28a30 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
28a40 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
28a50 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
28a60 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
28a70 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
28a80 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
28a90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
28aa0 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
28ab0 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
28ac0 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
28ad0 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
28ae0 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
28af0 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
28b00 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
28b10 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
28b20 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
28b30 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
28b40 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
28b50 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
28b60 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
28b70 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
28b80 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
28b90 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
28ba0 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
28bb0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
28bc0 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  R_OMIT_JOURNAL a
28bd0 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44  nd PAGER_NO_READ
28be0 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  LOCK flags..**.*
28bf0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
28c00 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
28c10 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
28c20 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
28c30 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
28c40 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
28c50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
28c60 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
28c70 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
28c80 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
28c90 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
28ca0 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
28cb0 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
28cc0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
28cd0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28ce0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
28cf0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
28d00 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
28d10 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
28d20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
28d30 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
28d40 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
28d50 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
28d60 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
28d70 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
28d80 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
28d90 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
28da0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
28db0 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
28dc0 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
28dd0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
28de0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
28df0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
28e00 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
28e10 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28e20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
28e30 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
28e40 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
28e50 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
28e60 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
28e70 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
28e80 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
28e90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
28ea0 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
28eb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
28ec0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
28ed0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
28ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
28ef0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
28f00 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
28f10 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
28f20 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
28f30 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
28f40 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
28f50 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
28f60 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
28f70 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
28f80 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
28f90 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
28fa0 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
28fb0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
28fc0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
28fd0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
28fe0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
28ff0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
29000 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
29010 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
29020 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
29030 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
29040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29050 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29060 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
29070 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
29080 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
29090 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
290a0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
290b0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
290c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
290d0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
290e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
290f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
29100 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
29110 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
29120 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
29130 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
29140 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
29150 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
29160 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
29170 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
29180 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
29190 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
291a0 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
291b0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
291c0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
291d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
291e0 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
291f0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
29200 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
29210 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
29220 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
29230 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
29240 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
29250 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
29260 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
29270 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20  ADLOCK)!=0;  /* 
29280 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61  True to omit rea
29290 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d-lock */.  int 
292a0 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
292b0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
292c0 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
292d0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
292e0 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
292f0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
29300 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
29310 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
29320 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
29330 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
29340 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
29350 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
29360 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
29370 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
29380 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
29390 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
293a0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
293b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
293c0 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
293d0 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
293e0 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
293f0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
29400 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
29410 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
29420 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
29430 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
29440 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
29450 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
29460 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
29470 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
29480 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
29490 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
294a0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
294b0 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
294c0 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
294d0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
294e0 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
294f0 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
29500 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
29510 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
29520 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
29530 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
29540 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
29550 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
29560 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
29570 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
29580 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
29590 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
295a0 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
295b0 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
295c0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
295d0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
295e0 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
295f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
29600 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
29610 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
29620 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
29630 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
29640 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
29650 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
29660 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
29670 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
29680 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
29690 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
296a0 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
296b0 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
296c0 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
296d0 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
296e0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
296f0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
29700 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
29710 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
29720 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
29730 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
29740 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
29750 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
29760 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
29770 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
29780 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
29790 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
297a0 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
297b0 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
297c0 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
297d0 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
297e0 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
297f0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  0] = 0;.    }els
29800 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
29810 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
29820 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
29830 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
29840 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
29850 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
29860 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29870 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
29880 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
29890 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
298a0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  thname);.    }..
298b0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
298c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
298d0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
298e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
298f0 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
29900 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
29910 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
29920 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
29930 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
29940 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
29950 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
29960 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
29970 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
29980 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
29990 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
299a0 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
299b0 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
299c0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
299d0 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
299e0 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
299f0 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
29a00 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
29a10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
29a20 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
29a30 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
29a40 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
29a50 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
29a60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29a70 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
29a80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
29a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29ab0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
29ac0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29ad0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
29ae0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
29af0 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
29b00 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
29b10 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
29b20 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
29b30 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
29b40 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
29b50 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
29b60 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
29b70 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
29b80 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
29b90 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
29ba0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
29bd0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
29be0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c00 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
29c10 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
29c20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
29c30 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
29c40 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
29c50 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
29c60 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
29c70 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
29c80 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
29c90 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
29ca0 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
29cb0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
29cc0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
29cd0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
29ce0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
29cf0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
29d00 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
29d10 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
29d20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
29d30 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
29d40 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
29d50 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
29d60 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
29d70 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
29d80 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
29d90 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
29da0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
29db0 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
29dc0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
29dd0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
29de0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
29df0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
29e00 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
29e10 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
29e20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
29e30 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
29e40 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
29e50 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
29e60 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
29e70 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20  Pathname + 1 +  
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29e90 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
29ea0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
29eb0 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  + 1             
29ec0 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
29ed0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29ee0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
29ef0 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 31 20  athname + 4 + 1 
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f10 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
29f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
29f30 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
29f40 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
29f50 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
29f60 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
29f70 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
29f80 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
29f90 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
29fa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
29fb0 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
29fc0 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
29fd0 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
29fe0 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
29ff0 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2a000 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2a010 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2a020 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2a030 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2a040 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2a050 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2a060 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2a070 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2a080 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2a090 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2a0a0 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2a0b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2a0c0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2a0d0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2a0e0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2a0f0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2a100 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2a110 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2a120 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2a130 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2a140 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2a150 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2a160 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2a170 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2a180 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2a190 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2a1a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2a1b0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
2a1c0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
2a1d0 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20  thname + 1);.   
2a1e0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2a1f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2a200 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2a210 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2a220 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
2a230 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2a240 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2a250 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
2a260 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2a270 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20  -journal", 8);. 
2a280 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a     if( pPager->z
2a290 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29  Filename[0]==0 )
2a2a0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
2a2b0 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b  zJournal[0] = 0;
2a2c0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
2a2d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2a2e0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 70     else{.      p
2a2f0 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70  Pager->zWal = &p
2a300 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2a310 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a  nPathname+8+1];.
2a320 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2a330 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68  ger->zWal, zPath
2a340 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2a350 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
2a360 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2a370 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c  thname], "-wal",
2a380 20 34 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   4);.    }.#endi
2a390 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  f.    sqlite3_fr
2a3a0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
2a3b0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
2a3c0 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
2a3d0 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
2a3e0 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
2a3f0 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
2a400 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
2a410 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2a420 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d  ename[0] && !mem
2a430 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f  Db ){.    int fo
2a440 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
2a450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
2a460 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  S flags returned
2a470 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   by xOpen() */. 
2a480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a490 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2a4a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2a4b0 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c  Pager->fd, vfsFl
2a4c0 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
2a4d0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
2a4e0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
2a4f0 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a  ADONLY);..    /*
2a500 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
2a510 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
2a520 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
2a530 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
2a540 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
2a550 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
2a560 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
2a570 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
2a580 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2a590 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
2a5a0 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
2a5b0 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a  aximum of:.    *
2a5c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51  *.    **    + SQ
2a5d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2a5e0 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20  E_SIZE,.    **  
2a5f0 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
2a600 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2a610 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
2a620 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2a630 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
2a640 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
2a650 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
2a660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2a670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a680 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
2a690 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
2a6a0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
2a6b0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2a6c0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2a6d0 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  E<=SQLITE_MAX_DE
2a6e0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
2a6f0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50 61  ;.      if( szPa
2a700 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73  geDflt<pPager->s
2a710 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
2a720 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2a730 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
2a740 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2a750 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
2a760 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2a770 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
2a780 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2a790 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2a7a0 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2a7b0 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67  Dflt = (u32)pPag
2a7c0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
2a7d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a7e0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2a7f0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2a800 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ITE.      {.    
2a810 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
2a820 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2a830 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2a840 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
2a850 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2a860 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2a870 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
2a880 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
2a890 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2a8a0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2a8b0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2a8c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2a8d0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2a8e0 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
2a8f0 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  36);.        for
2a900 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2a910 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2a920 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2a930 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2a940 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
2a950 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2a960 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
2a970 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2a980 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20  eDflt = ii;.    
2a990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a9a0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
2a9b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2a9c0 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70      /* If a temp
2a9d0 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65  orary file is re
2a9e0 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e  quested, it is n
2a9f0 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69  ot opened immedi
2aa00 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e  ately..    ** In
2aa10 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63   this case we ac
2aa20 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74  cept the default
2aa30 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64   page size and d
2aa40 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20  elay actually.  
2aa50 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65    ** opening the
2aa60 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
2aa70 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73  first call to Os
2aa80 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Write()..    **.
2aa90 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2aaa0 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66  ch is also run f
2aab0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2aac0 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d  database. An in-
2aad0 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61  memory.    ** da
2aae0 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61  tabase is the sa
2aaf0 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c  me as a temp-fil
2ab00 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20  e that is never 
2ab10 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20  written out to. 
2ab20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75     ** disk and u
2ab30 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ses an in-memory
2ab40 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2ab50 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  l..    */ .    t
2ab60 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2ab70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2ab80 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
2ab90 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
2aba0 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  k = EXCLUSIVE_LO
2abb0 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  CK;.    readOnly
2abc0 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c   = (vfsFlags&SQL
2abd0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2abe0 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  Y);.  }..  /* Th
2abf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
2ac00 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65   to PagerSetPage
2ac10 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f  size() serves to
2ac20 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
2ac30 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61  f .  ** Pager.pa
2ac40 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c  geSize and to al
2ac50 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
2ac60 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
2ac70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
2ac80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ac90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2aca0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20  r->memDb==0 );. 
2acb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2acc0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2acd0 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44  pPager, &szPageD
2ace0 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  flt, -1);.    te
2acf0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
2ad00 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
2ad10 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2ad20 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65  ccurred in eithe
2ad30 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
2ad40 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2ad50 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75  .  ** Pager stru
2ad60 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
2ad70 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
2ad80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ad90 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2ada0 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ( !pPager->pTmpS
2adb0 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  pace );.    sqli
2adc0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2add0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
2ade0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2adf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2ae00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
2ae10 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
2ae20 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73   object. */.  as
2ae30 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30  sert( nExtra<100
2ae40 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20  0 );.  nExtra = 
2ae50 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
2ae60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
2ae70 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
2ae80 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
2aeb0 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
2aec0 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
2aed0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
2aee0 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
2aef0 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
2af00 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
2af10 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
2af20 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
2af30 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
2af40 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2af50 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2af60 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
2af70 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
2af80 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
2af90 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
2afa0 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72  (noReadlock && r
2afb0 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20  eadOnly) ?1:0;. 
2afc0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2afd0 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
2afe0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
2aff0 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
2b000 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
2b010 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2b020 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
2b030 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2b040 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
2b050 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2b060 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
2b070 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
2b080 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
2b090 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
2b0a0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2b0b0 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69  ER_UNLOCK; */.#i
2b0c0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 50  f 0.  assert( pP
2b0d0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
2b0e0 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
2b0f0 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
2b100 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65  ER_UNLOCK) );.#e
2b110 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72  ndif.  /* pPager
2b120 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
2b130 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
2b140 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
2b150 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
2b160 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2b170 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2b180 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
2b190 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2b1a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2b1b0 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
2b1c0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2b1d0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
2b1e0 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
2b1f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
2b200 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
2b210 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2b220 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
2b230 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2b240 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
2b250 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
2b260 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
2b270 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73  8)readOnly;.  as
2b280 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
2b290 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
2b2a0 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
2b2b0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
2b2c0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2b2d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2b2e0 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
2b2f0 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d   ?0:1;.  pPager-
2b300 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
2b310 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2b320 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
2b330 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2b340 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2b350 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2b360 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2b370 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2b380 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2b390 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2b3a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2b3b0 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2b3c0 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2b3d0 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2b3e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2b3f0 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2b400 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2b410 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2b420 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2b430 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2b440 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2b450 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b460 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2b470 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2b480 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2b490 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2b4a0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2b4b0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2b4c0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2b4d0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2b4e0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2b4f0 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2b500 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2b510 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2b520 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2b530 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2b540 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2b550 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
2b560 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2b570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2b580 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2b590 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2b5a0 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69  fter transitioni
2b5b0 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e  ng from PAGER_UN
2b5c0 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52  LOCK to.** PAGER
2b5d0 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49  _SHARED state. I
2b5e0 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65  t tests if there
2b5f0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2b600 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20  l present in.** 
2b610 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2b620 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
2b630 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ger. A hot journ
2b640 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a  al is one that .
2b650 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ** needs to be p
2b660 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f  layed back. Acco
2b670 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75  rding to this fu
2b680 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f  nction, a hot-jo
2b690 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78  urnal.** file ex
2b6a0 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ists if the foll
2b6b0 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61  owing criteria a
2b6c0 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
2b6d0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2b6e0 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  le exists in the
2b6f0 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e   file system, an
2b700 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63  d.**   * No proc
2b710 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2b720 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
2b730 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2b740 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a  base file, and.*
2b750 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
2b760 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69  se file itself i
2b770 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
2b780 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
2b790 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66  and.**   * The f
2b7a0 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
2b7b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2b7c0 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
2b7d0 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  0x00..**.** If t
2b7e0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
2b7f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2b800 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
2b810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2b820 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
2b830 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
2b840 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
2b850 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
2b860 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
2b870 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49  the same name. I
2b880 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2b890 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
2b8a0 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ** just deleted 
2b8b0 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20  using OsDelete, 
2b8c0 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2b8d0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2b8e0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2b8f0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2b900 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63  utine does not c
2b910 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  heck if there is
2b920 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2b930 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74  l filename.** at
2b940 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2b950 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
2b960 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74  s, and that mast
2b970 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er journal file.
2b980 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
2b990 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  t, then the jour
2b9a0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2b9b0 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74  really hot. In t
2b9c0 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73  his.** case this
2b9d0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
2b9e0 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  turn a false-pos
2b9f0 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72  itive. The pager
2ba00 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72  _playback().** r
2ba10 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
2ba20 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f  over that the jo
2ba30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2ba40 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
2ba50 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f   .** will not ro
2ba60 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a  ll it back. .**.
2ba70 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ** If a hot-jour
2ba80 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  nal file is foun
2ba90 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78  d to exist, *pEx
2baa0 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31  ists is set to 1
2bab0 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
2bac0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2bad0 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  no hot-journal f
2bae0 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ile is present, 
2baf0 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73  *pExists is.** s
2bb00 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2bb10 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2bb20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2bb30 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2bb40 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ng.** to determi
2bb50 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
2bb60 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  t a hot-journal 
2bb70 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65  file exists, the
2bb80 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   IO error.** cod
2bb90 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2bba0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2bbb0 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66  pExists is undef
2bbc0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2bbd0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
2bbe0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
2bbf0 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
2bc00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2bc10 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2bc20 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
2bc30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2bc50 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2bc60 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20  nt exists = 1;  
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc80 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61  True if a journa
2bc90 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2bca0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f  t */.  int jrnlO
2bcb0 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70  pen = !!isOpen(p
2bcc0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20  Pager->jfd);..  
2bcd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2bce0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2bcf0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2bd00 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2bd10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2bd20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2bd30 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  EN );..  assert(
2bd40 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
2bd50 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
2bd60 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2bd70 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
2bd80 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
2bd90 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
2bda0 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
2bdb0 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
2bdc0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2bdd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2bde0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
2bdf0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2be00 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
2be10 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
2be20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2be30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
2be40 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
2be50 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20  ocked = 0;      
2be60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2be70 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
2be80 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2be90 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
2bea0 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
2beb0 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
2bec0 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
2bed0 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
2bee0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
2bef0 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
2bf00 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
2bf10 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
2bf20 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
2bf30 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
2bf40 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
2bf50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
2bf60 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
2bf70 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
2bf80 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
2bf90 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
2bfa0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
2bfb0 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
2bfc0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
2bfd0 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
2bfe0 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
2bff0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2c000 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
2c010 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
2c020 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
2c030 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
2c040 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
2c050 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
2c060 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
2c070 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
2c080 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
2c090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2c0a0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2c0b0 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
2c0c0 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
2c0d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2c0e0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
2c0f0 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ed ){.      Pgno
2c100 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2c110 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2c120 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
2c130 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2c140 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2c150 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
2c160 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2c170 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
2c180 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
2c190 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
2c1a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2c1b0 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
2c1c0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
2c1d0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
2c1e0 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
2c1f0 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
2c200 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
2c210 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
2c220 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2c230 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
2c240 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
2c250 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
2c260 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
2c270 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
2c280 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
2c290 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
2c2a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2c2b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c2c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  {.        if( nP
2c2d0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2c2e0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
2c2f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2c300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
2c310 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
2c320 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
2c330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c340 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c350 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
2c360 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2c370 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
2c380 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62     pagerUnlockDb
2c390 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2c3a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
2c3b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
2c3c0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
2c3d0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
2c3e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c3f0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
2c400 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
2c410 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
2c420 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
2c430 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
2c440 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2c450 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2c460 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
2c470 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
2c480 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
2c490 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
2c4a0 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
2c4b0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
2c4c0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
2c4d0 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
2c4e0 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
2c4f0 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
2c500 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
2c510 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
2c520 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
2c530 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
2c540 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2c550 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2c560 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2c570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2c580 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
2c590 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
2c5a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2c5b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2c5c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2c5d0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2c5e0 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
2c5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c600 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c610 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c620 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
2c630 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2c640 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
2c650 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
2c660 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
2c670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2c680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
2c690 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
2c6a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c6b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c6c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c6d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
2c6e0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
2c6f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c700 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2c710 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
2c720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c730 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
2c740 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
2c750 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2c760 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
2c770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2c780 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
2c790 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
2c7a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
2c7b0 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2c7d0 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
2c7e0 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
2c7f0 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
2c800 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
2c810 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
2c820 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
2c830 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
2c840 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
2c850 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
2c860 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
2c870 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
2c880 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2c890 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
2c8a0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2c8b0 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
2c8c0 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
2c8d0 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
2c8e0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
2c8f0 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
2c900 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
2c910 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
2c920 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
2c930 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
2c940 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
2c950 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2c960 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
2c970 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
2c980 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
2c990 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
2c9a0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
2c9b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2c9c0 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
2c9d0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2c9e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c9f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
2ca00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ca10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2ca20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2ca30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2ca40 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
2ca50 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
2ca60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2ca70 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
2ca80 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
2ca90 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
2caa0 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
2cab0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
2cac0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
2cad0 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
2cae0 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
2caf0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
2cb00 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
2cb10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2cb20 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
2cb30 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
2cb40 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
2cb50 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
2cb60 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
2cb70 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
2cb80 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
2cb90 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
2cba0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
2cbb0 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
2cbc0 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
2cbd0 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
2cbe0 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2cbf0 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
2cc00 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
2cc10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2cc20 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
2cc30 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
2cc40 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
2cc50 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
2cc60 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2cc70 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
2cc80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
2cc90 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
2cca0 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
2ccb0 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
2ccc0 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
2ccd0 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
2cce0 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
2ccf0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
2cd00 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
2cd10 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
2cd20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
2cd30 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
2cd40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2cd50 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
2cd60 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
2cd70 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
2cd80 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
2cd90 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
2cda0 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
2cdb0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
2cdc0 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
2cdd0 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
2cde0 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
2cdf0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
2ce00 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
2ce10 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
2ce20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
2ce30 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
2ce40 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
2ce50 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2ce60 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
2ce70 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
2ce80 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
2ce90 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
2cea0 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
2ceb0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
2cec0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
2ced0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2cee0 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
2cef0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
2cf00 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
2cf10 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  * occurs while l
2cf20 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
2cf30 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
2cf40 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
2cf50 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c  file or .** roll
2cf60 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
2cf70 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20  al file, the IO 
2cf80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2cf90 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2cfa0 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
2cfb0 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
2cfc0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2cfd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2cfe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2cff0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2d000 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2d010 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
2d020 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f  rom b-tree and o
2d030 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61  nly when there a
2d040 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74  re no.  ** outst
2d050 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68  anding pages. Th
2d060 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
2d070 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  the pager state 
2d080 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20  should either.  
2d090 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45  ** be OPEN or RE
2d0a0 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20  ADER. READER is 
2d0b0 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
2d0c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72   the pager is or
2d0d0 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78   was in .  ** ex
2d0e0 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
2d0f0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
2d100 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
2d110 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2d120 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
2d130 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
2d140 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2d150 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
2d160 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2d170 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
2d180 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2d190 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
2d1a0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d  .  if( NEVER(MEM
2d1b0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  DB && pPager->er
2d1c0 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e  rCode) ){ return
2d1d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d1e0 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65  ; }..  if( !page
2d1f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2d200 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
2d210 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e==PAGER_OPEN ){
2d220 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75  .    int bHotJou
2d230 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  rnal = 1;       
2d240 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2d250 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74  ere exists a hot
2d260 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f   journal-file */
2d270 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ..    assert( !M
2d280 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
2d290 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  rt( pPager->noRe
2d2a0 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50 61  adlock==0 || pPa
2d2b0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  ger->readOnly );
2d2c0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
2d2d0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20  ->noReadlock==0 
2d2e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2d2f0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
2d300 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2d310 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2d320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d330 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2d340 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
2d350 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
2d360 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
2d370 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
2d380 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2d390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2d3a0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
2d3b0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
2d3c0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2d3d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
2d3e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2d3f0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2d400 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
2d410 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2d420 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
2d430 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
2d440 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
2d450 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
2d460 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
2d470 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
2d480 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
2d490 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d4a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d4b0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
2d4c0 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
2d4d0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
2d4e0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
2d4f0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
2d500 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
2d510 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
2d520 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
2d530 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
2d540 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
2d550 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
2d560 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
2d570 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
2d580 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
2d590 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
2d5a0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
2d5b0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
2d5c0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
2d5d0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2d5e0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
2d5f0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
2d600 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
2d610 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
2d620 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2d630 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
2d640 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
2d650 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
2d660 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
2d670 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
2d680 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
2d690 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2d6a0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
2d6b0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
2d6c0 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
2d6d0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
2d6e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
2d6f0 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
2d700 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
2d710 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
2d720 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
2d730 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
2d740 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
2d750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d760 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
2d770 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
2d780 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
2d790 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2d7a0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
2d7b0 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
2d7c0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
2d7d0 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
2d7e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2d7f0 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
2d800 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2d810 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
2d820 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2d830 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d850 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2d860 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
2d870 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
2d880 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
2d890 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
2d8a0 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
2d8b0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
2d8c0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
2d8d0 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
2d8e0 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
2d8f0 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
2d900 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
2d910 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
2d920 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2d930 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
2d940 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
2d950 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
2d960 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
2d970 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
2d980 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
2d990 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
2d9a0 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
2d9b0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
2d9c0 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
2d9d0 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
2d9e0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
2d9f0 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
2da00 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
2da10 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
2da20 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
2da30 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
2da40 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
2da50 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
2da60 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
2da70 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2da80 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
2da90 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
2daa0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
2dab0 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
2dac0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
2dad0 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
2dae0 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
2daf0 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
2db00 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
2db10 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
2db20 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
2db30 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
2db40 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
2db50 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
2db60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
2db70 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
2db80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2db90 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2dba0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
2dbb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
2dbc0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
2dbd0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
2dbe0 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2dc00 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
2dc10 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
2dc20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2dc30 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
2dc40 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
2dc50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2dc60 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2dc70 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
2dc80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2dc90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
2dca0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
2dcb0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2dcc0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
2dcd0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2dce0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2dcf0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2dd00 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
2dd10 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
2dd20 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
2dd30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2dd40 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2dd50 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
2dd60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
2dd70 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
2dd80 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2dd90 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2dda0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2ddc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ddd0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2dde0 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
2ddf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2de00 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2de10 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2de20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2de30 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2de40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2de50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
2de60 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
2de70 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
2de80 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
2de90 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
2dea0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
2deb0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
2dec0 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
2ded0 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
2dee0 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
2def0 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
2df00 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
2df10 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
2df20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
2df30 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
2df40 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
2df50 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
2df60 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
2df70 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
2df80 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
2df90 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
2dfa0 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
2dfb0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
2dfc0 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
2dfd0 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
2dfe0 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
2dff0 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
2e000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
2e010 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
2e020 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
2e030 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
2e040 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2e050 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2e060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2e070 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2e080 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
2e090 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2e0a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e0b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2e0c0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
2e0d0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
2e0e0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2e0f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2e100 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
2e110 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2e120 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
2e130 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
2e140 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
2e150 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2e160 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
2e170 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2e180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e190 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2e1a0 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
2e1b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
2e1c0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
2e1d0 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
2e1e0 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
2e1f0 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
2e200 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
2e210 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
2e220 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
2e230 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
2e240 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2e250 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2e260 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
2e270 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
2e280 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
2e290 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
2e2a0 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
2e2b0 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
2e2c0 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
2e2d0 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
2e2e0 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
2e2f0 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
2e300 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
2e310 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
2e320 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
2e330 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e340 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
2e350 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
2e360 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
2e370 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
2e380 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
2e390 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
2e3a0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
2e3b0 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
2e3c0 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
2e3d0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
2e3e0 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
2e3f0 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
2e400 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
2e410 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
2e420 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
2e430 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
2e440 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
2e450 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
2e460 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
2e470 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
2e480 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
2e490 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
2e4a0 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
2e4b0 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
2e4c0 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
2e4d0 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
2e4e0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
2e4f0 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
2e500 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
2e510 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
2e520 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
2e530 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
2e540 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
2e550 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2e560 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
2e570 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
2e580 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
2e590 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
2e5a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e5b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2e5c0 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
2e5d0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
2e5e0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
2e5f0 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
2e600 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
2e610 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
2e620 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
2e630 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
2e640 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
2e650 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e660 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
2e670 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71  r->pBackup || sq
2e680 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
2e690 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2e6a0 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29 7b  ache)>0) .    ){
2e6b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
2e6c0 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
2e6d0 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
2e6e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2e6f0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
2e700 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
2e710 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
2e720 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
2e730 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
2e740 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
2e750 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
2e760 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2e770 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
2e780 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
2e790 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
2e7a0 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
2e7b0 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
2e7c0 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
2e7d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e7e0 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
2e7f0 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
2e800 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
2e810 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
2e820 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
2e830 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
2e840 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
2e850 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
2e860 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
2e870 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
2e880 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
2e890 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
2e8a0 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
2e8b0 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
2e8c0 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
2e8d0 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
2e8e0 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
2e8f0 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
2e900 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
2e910 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
2e920 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
2e930 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
2e940 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
2e950 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
2e960 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
2e970 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
2e980 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
2e990 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
2e9a0 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
2e9b0 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
2e9c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e9d0 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a  Pgno nPage = 0;.
2e9e0 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
2e9f0 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
2ea00 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2ea10 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ];..      rc = p
2ea20 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2ea30 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
2ea40 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2ea50 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20  to failed;..    
2ea60 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
2ea70 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
2ea80 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
2ea90 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
2eaa0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
2eab0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2eac0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
2ead0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
2eae0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
2eaf0 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
2eb00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2eb10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eb20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2eb30 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
2eb40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb50 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
2eb60 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
2eb70 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
2eb80 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2eb90 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
2eba0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
2ebb0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
2ebc0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
2ebd0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
2ebe0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
2ebf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2ec00 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2ec10 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
2ec20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
2ec30 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
2ec40 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
2ec50 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
2ec60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
2ec70 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
2ec80 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
2ec90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2eca0 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
2ecb0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
2ecc0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
2ecd0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
2ece0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  E_OK );.  }..  i
2ecf0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
2ed00 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
2ed10 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2ed20 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
2ed30 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
2ed40 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2ed50 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
2ed60 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2ed70 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
2ed80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ed90 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2eda0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
2edb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
2edc0 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
2edd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ede0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2edf0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
2ee00 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
2ee10 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
2ee20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2ee30 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
2ee40 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
2ee50 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2ee60 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20  R_READER;.  }.  
2ee70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ee80 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
2ee90 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
2eea0 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
2eeb0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
2eec0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2eed0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
2eee0 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
2eef0 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
2ef00 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
2ef10 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
2ef20 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
2ef30 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2ef40 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
2ef50 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
2ef60 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
2ef70 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
2ef80 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
2ef90 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
2efa0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
2efb0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
2efc0 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
2efd0 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
2efe0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2eff0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2f000 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
2f010 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
2f020 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
2f030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
2f040 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
2f050 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
2f060 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
2f070 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
2f080 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
2f090 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
2f0a0 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
2f0b0 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
2f0c0 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
2f0d0 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
2f0e0 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
2f0f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2f100 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2f110 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
2f120 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2f130 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
2f140 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
2f150 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
2f160 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
2f170 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
2f180 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
2f190 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
2f1a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
2f1b0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
2f1c0 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
2f1d0 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
2f1e0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
2f1f0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
2f200 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
2f210 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
2f220 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
2f230 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
2f240 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
2f250 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
2f260 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
2f270 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
2f280 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
2f290 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
2f2a0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
2f2b0 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
2f2c0 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
2f2d0 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
2f2e0 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
2f2f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2f300 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
2f310 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
2f320 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
2f330 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
2f340 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
2f350 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
2f360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
2f370 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
2f380 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
2f390 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
2f3a0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
2f3b0 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
2f3c0 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
2f3d0 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
2f3e0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
2f3f0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
2f400 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
2f410 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
2f420 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
2f430 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
2f440 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
2f450 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
2f460 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
2f470 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
2f480 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
2f490 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
2f4a0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
2f4b0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
2f4c0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
2f4d0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
2f4e0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
2f4f0 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
2f500 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
2f510 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
2f520 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
2f530 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
2f540 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
2f550 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
2f560 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
2f570 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
2f580 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
2f590 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
2f5a0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
2f5b0 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
2f5c0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
2f5d0 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
2f5e0 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
2f5f0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2f600 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
2f610 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
2f620 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
2f630 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
2f640 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
2f650 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2f660 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
2f670 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
2f680 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
2f690 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
2f6a0 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
2f6b0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
2f6c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
2f6d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
2f6e0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
2f6f0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
2f700 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
2f710 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
2f720 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
2f730 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
2f740 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
2f750 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
2f760 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2f770 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
2f780 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
2f790 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
2f7a0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
2f7b0 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
2f7c0 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
2f7d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
2f7e0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
2f7f0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
2f800 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
2f810 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
2f820 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
2f830 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2f840 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
2f850 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
2f860 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
2f870 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
2f880 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
2f890 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
2f8a0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
2f8b0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
2f8c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2f8d0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
2f8e0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
2f8f0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
2f900 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
2f910 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
2f920 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
2f930 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
2f940 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
2f950 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
2f960 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
2f970 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
2f980 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
2f990 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
2f9a0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
2f9b0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
2f9c0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
2f9d0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
2f9e0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
2f9f0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
2fa00 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
2fa10 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
2fa20 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
2fa30 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
2fa40 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
2fa50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
2fa60 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
2fa70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fa80 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2fa90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2faa0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
2fab0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
2fac0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
2fad0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
2fae0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
2faf0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
2fb00 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
2fb10 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
2fb20 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
2fb30 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
2fb40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
2fb50 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
2fb60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2fb70 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
2fb80 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
2fb90 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2fba0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
2fbb0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
2fbc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fbd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fbe0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2fbf0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
2fc00 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
2fc10 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
2fc20 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
2fc30 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
2fc40 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
2fc50 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
2fc60 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
2fc70 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
2fc80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
2fc90 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2fca0 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
2fcb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2fcc0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
2fcd0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
2fce0 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a  1, ppPage);.  }.
2fcf0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2fd00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
2fd10 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
2fd20 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
2fd30 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
2fd40 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
2fd50 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
2fd60 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2fd70 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
2fd80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2fd90 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
2fda0 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
2fdb0 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
2fdc0 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
2fdd0 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
2fde0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
2fdf0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
2fe00 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
2fe10 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
2fe20 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
2fe30 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
2fe40 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
2fe50 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
2fe60 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
2fe70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26  Page)->pPager &&
2fe80 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
2fe90 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2fea0 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
2feb0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
2fec0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
2fed0 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
2fee0 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
2fef0 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
2ff00 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
2ff10 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
2ff20 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
2ff30 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2ff40 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41  Pager) );.    PA
2ff50 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
2ff60 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75  >nHit);.    retu
2ff70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
2ff80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2ff90 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
2ffa0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
2ffb0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
2ffc0 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
2ffd0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
2ffe0 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 50 41 47  ed.  */..    PAG
2fff0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
30000 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20  nMiss);.    pPg 
30010 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70  = *ppPage;.    p
30020 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
30030 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ger;..    /* The
30040 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
30050 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
30060 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
30070 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
30080 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
30090 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
300a0 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63  r the unused loc
300b0 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65  king-page, is re
300c0 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20  quested. */.    
300d0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
300e0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
300f0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
30100 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
30110 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
30120 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
30130 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
30140 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
30150 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20     if( MEMDB || 
30160 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
30170 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
30180 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
30190 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
301a0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
301b0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
301c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
301d0 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f  FULL;.        go
301e0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
301f0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
30200 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
30210 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
30220 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
30230 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
30240 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
30250 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
30260 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
30270 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
30280 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
30290 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
302a0 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
302b0 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
302c0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
302d0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
302e0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
302f0 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
30300 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
30310 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
30320 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
30330 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
30340 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
30350 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
30360 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
30370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
30380 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
30390 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
303a0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
303b0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
303c0 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
303d0 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
303e0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
303f0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
30400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
30410 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
30420 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
30430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
30440 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
30450 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
30460 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
30470 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
30480 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
30490 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
304a0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
304b0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
304c0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
304d0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
304e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
304f0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
30500 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
30510 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
30520 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30530 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
30540 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
30550 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
30560 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
30570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30590 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
305a0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
305b0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
305c0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
305d0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
305e0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
305f0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
30600 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
30610 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
30620 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
30630 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
30640 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
30650 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
30660 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
30670 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
30680 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
30690 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
306a0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
306b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
306c0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
306d0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
306e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
306f0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
30700 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
30710 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
30720 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
30730 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
30740 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
30750 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
30760 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
30770 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
30780 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
30790 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
307a0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
307b0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
307c0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
307d0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
307e0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
307f0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
30800 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
30810 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
30820 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
30830 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
30840 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
30850 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
30860 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
30870 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
30880 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
30890 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
308a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
308b0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
308c0 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
308d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
308e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
308f0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
30900 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
30910 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  che!=0 );.  asse
30920 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
30930 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
30940 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
30950 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
30960 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
30970 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
30980 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
30990 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72  , &pPg);.  retur
309a0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
309b0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
309c0 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
309d0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
309e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
309f0 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
30a00 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
30a10 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
30a20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
30a30 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
30a40 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
30a50 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
30a60 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
30a70 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
30a80 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30a90 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
30aa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
30ab0 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
30ac0 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
30ad0 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72  pPg ){.    Pager
30ae0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
30af0 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
30b00 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
30b10 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72  (pPg);.    pager
30b20 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
30b30 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
30b40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
30b50 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
30b60 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
30b70 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
30b80 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
30b90 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
30ba0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
30bb0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
30bc0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
30bd0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
30be0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
30bf0 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
30c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
30c10 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
30c20 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
30c30 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
30c40 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
30c50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
30c60 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
30c70 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
30c80 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
30c90 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
30ca0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
30cb0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
30cc0 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
30cd0 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
30ce0 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
30cf0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
30d00 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
30d10 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
30d20 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
30d30 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
30d40 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
30d50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30d60 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
30d70 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
30d80 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
30d90 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
30da0 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
30db0 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
30dc0 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
30dd0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
30de0 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
30df0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
30e00 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
30e10 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
30e20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
30e30 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
30e40 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
30e50 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
30e60 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
30e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
30e80 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
30e90 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
30ea0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
30eb0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
30ec0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
30ed0 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
30ee0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
30ef0 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
30f00 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
30f10 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
30f20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30f30 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
30f40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
30f50 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
30f60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30f70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
30f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f90 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30fa0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
30fb0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
30fc0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
30fd0 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
30fe0 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
30ff0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
31000 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
31010 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
31020 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
31030 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
31040 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
31050 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31060 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
31070 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
31080 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
31090 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
310a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
310b0 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
310c0 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
310d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
310e0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
310f0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
31100 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
31110 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
31120 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
31130 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
31140 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
31150 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
31160 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
31170 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
31180 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
31190 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
311a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
311b0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
311c0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
311d0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
311e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
311f0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
31200 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31210 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
31220 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
31230 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31240 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
31250 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
31260 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
31270 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
31280 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
31290 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
312a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
312b0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
312c0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
312d0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
312e0 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
312f0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
31300 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
31310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31320 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
31330 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
31340 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  */.          SQL
31350 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
31360 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
31370 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
31380 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
31390 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
313a0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
313b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
313c0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
313d0 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
313e0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
313f0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
31400 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69           );.  #i
31410 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
31420 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
31430 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31440 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
31450 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
31460 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
31470 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
31480 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
31490 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
314a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c          );.  #el
314b0 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  se.        rc = 
314c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
314d0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
314e0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
314f0 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  d, flags, 0);.  
31500 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
31510 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
31520 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
31530 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31540 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
31550 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
31560 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
31570 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
31580 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
31590 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
315a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
315b0 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
315c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
315d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
315e0 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
315f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
31600 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
31610 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
31620 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
31630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
31640 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
31650 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
31660 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
31670 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
31680 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
31690 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
316a0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
316b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
316c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
316d0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
316e0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
316f0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
31700 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
31710 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
31720 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31730 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
31740 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
31750 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
31760 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
31770 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
31780 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
31790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
317a0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
317b0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
317c0 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
317d0 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
317e0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
317f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
31800 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
31810 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
31820 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
31830 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
31840 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
31850 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
31860 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
31870 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
31880 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
31890 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
318a0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
318b0 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
318c0 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
318d0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
318e0 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
318f0 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
31900 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
31910 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
31920 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
31930 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
31940 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
31950 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
31960 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
31970 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
31980 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
31990 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
319a0 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
319b0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
319c0 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
319d0 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
319e0 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
319f0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
31a00 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
31a10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
31a20 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
31a30 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
31a40 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
31a50 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
31a60 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
31a70 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
31a80 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
31a90 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
31aa0 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
31ab0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
31ac0 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
31ad0 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
31ae0 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
31af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31b00 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
31b10 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
31b20 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
31b30 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
31b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
31b50 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
31b60 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
31b70 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
31b80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31b90 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
31ba0 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
31bb0 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
31bc0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
31bd0 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
31be0 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
31bf0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
31c00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
31c10 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
31c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31c30 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
31c40 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
31c50 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
31c60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
31c70 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
31c80 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
31c90 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
31ca0 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
31cb0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
31cc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
31cd0 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
31ce0 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
31cf0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
31d00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
31d10 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
31d20 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
31d30 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
31d40 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
31d50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
31d60 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
31d70 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
31d80 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
31d90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31da0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31db0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
31dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
31dd0 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
31de0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
31df0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31e00 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
31e10 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
31e20 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
31e30 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
31e40 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
31e50 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
31e60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
31e70 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
31e80 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
31e90 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
31ea0 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
31eb0 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
31ec0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
31ed0 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
31ee0 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
31ef0 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
31f00 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
31f10 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
31f20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
31f40 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
31f50 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
31f60 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
31f70 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
31f80 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
31f90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31fa0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
31fb0 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
31fc0 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
31fd0 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
31fe0 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
31ff0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
32000 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
32010 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
32020 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
32030 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
32040 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
32050 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
32060 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
32070 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
32080 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
32090 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
320a0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
320b0 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
320c0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
320d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
320e0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
320f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
32100 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
32110 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
32120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32130 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
32140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32150 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
32160 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
32170 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
32180 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
32190 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
321a0 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
321b0 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
321c0 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
321d0 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
321e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
321f0 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
32200 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
32210 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
32220 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
32230 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
32240 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
32250 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
32260 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
32270 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
32280 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
32290 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
322a0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
322b0 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
322c0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
322d0 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
322e0 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
322f0 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
32300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
32310 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
32320 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
32330 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
32340 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
32350 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
32360 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
32370 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
32380 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
32390 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
323a0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
323b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
323c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
323d0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
323e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
323f0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
32400 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
32410 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
32420 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
32430 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
32440 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
32450 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
32460 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
32470 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
32480 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
32490 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
324a0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
324b0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
324c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
324d0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
324e0 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
324f0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
32500 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
32510 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
32520 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
32530 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
32540 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
32550 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
32560 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
32570 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
32580 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
32590 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
325a0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
325b0 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
325c0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
325d0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
325e0 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
325f0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
32600 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
32610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
32620 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
32630 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
32640 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
32650 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
32660 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
32670 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
32680 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68  ITE_OK;..  /* Th
32690 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
326a0 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
326b0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
326c0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
326d0 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74  .  ** been start
326e0 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  ed. The journal 
326f0 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
32700 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74  not be open at t
32710 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
32720 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  It is never call
32730 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ed in the ERROR 
32740 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  state..  */.  as
32750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32760 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
32770 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
32780 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
32790 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
327a0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
327b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
327c0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
327d0 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
327e0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
327f0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
32800 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
32810 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
32820 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
32830 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ed, report the s
32840 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61  ame error.  ** a
32850 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c  gain. This shoul
32860 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75  d not happen, bu
32870 74 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76  t the check prov
32880 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e  ides robustness.
32890 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
328a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
328b0 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65   )  return pPage
328c0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
328d0 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  * Higher-level r
328e0 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61  outines never ca
328f0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
32900 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
32910 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c  not.  ** writabl
32920 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e  e.  But check an
32930 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72  yway, just for r
32940 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20  obustness. */.  
32950 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
32960 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65  ->readOnly) ) re
32970 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
32980 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
32990 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
329a0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
329b0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
329c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
329d0 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
329e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
329f0 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
32a00 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
32a10 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
32a20 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
32a30 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
32a40 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
32a50 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
32a60 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
32a70 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
32a80 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
32a90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32aa0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
32ab0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
32ac0 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
32ad0 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
32ae0 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
32af0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
32b00 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
32b10 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
32b20 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
32b30 6c 20 6f 72 20 74 68 65 20 63 68 65 63 6b 70 6f  l or the checkpo
32b40 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
32b50 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
32b60 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72  **.    ** Higher
32b70 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
32b80 68 61 76 65 20 61 6c 72 65 61 64 79 20 6f 62 74  have already obt
32b90 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
32ba0 61 72 79 20 6c 6f 63 6b 73 0a 20 20 20 20 2a 2a  ary locks.    **
32bb0 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72   to begin the wr
32bc0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
32bd0 20 62 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63   but the rollbac
32be0 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  k journal might 
32bf0 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 79 65 74 20  not .    ** yet 
32c00 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74  be open. Open it
32c10 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20   now if this is 
32c20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
32c30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
32c40 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
32c50 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
32c60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32c70 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
32c80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
32c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32cb0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
32cc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
32cd0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
32ce0 4d 4f 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MOD );.    asser
32cf0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
32d00 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
32d10 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
32d20 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
32d30 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
32d40 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
32d50 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
32d60 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
32d70 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
32d80 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
32d90 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
32da0 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
32db0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
32dc0 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
32dd0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
32de0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32df0 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28   !pageInJournal(
32e00 70 50 67 29 20 26 26 20 21 70 61 67 65 72 55 73  pPg) && !pagerUs
32e10 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
32e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 61        assert( pa
32e30 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32e40 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
32e50 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
32e60 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
32e70 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
32e80 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
32e90 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
32ea0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
32eb0 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  2;.        i64 i
32ec0 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
32ed0 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20  urnalOff;..     
32ee0 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
32ef0 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
32f00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32f10 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
32f20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
32f30 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
32f40 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
32f50 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
32f60 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  fies.        ** 
32f70 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
32f80 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
32f90 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
32fa0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
32fb0 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  er) );..        
32fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32fd0 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67  journalHdr<=pPag
32fe0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
32ff0 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
33000 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
33010 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
33020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33030 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
33040 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
33050 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
33060 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20  (u8*)pData2);.. 
33070 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69         /* Even i
33080 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
33090 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ull error occurs
330a0 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
330b0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
330c0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
330d0 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
330e0 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
330f0 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
33100 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
33110 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
33120 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
33130 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
33140 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
33150 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
33160 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
33170 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
33180 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
33190 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
331a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
331b0 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
331c0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
331d0 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
331e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
331f0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
33200 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
33210 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66  /.        pPg->f
33220 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
33230 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20  ED_SYNC;..      
33240 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
33250 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
33260 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  iOff, pPg->pgno)
33270 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
33290 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
332a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
332b0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
332c0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
332d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66  ->pageSize, iOff
332e0 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +4);.        if(
332f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33310 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
33320 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
33330 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70  , iOff+pPager->p
33340 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d  ageSize+4, cksum
33350 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
33370 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
33380 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
33390 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
333a0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
333b0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
333c0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
333d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
333e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
333f0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
33400 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
33410 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
33420 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
33430 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
33440 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
33450 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
33460 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
33470 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
33480 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
33490 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
334a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
334b0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70  ED_SYNC)?1:0), p
334c0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
334d0 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70  g)));..        p
334e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
334f0 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d  f += 8 + pPager-
33500 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
33510 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
33520 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
33530 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
33540 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
33550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33560 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
33570 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
33580 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
33590 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
335a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
335b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
335c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
335d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
335e0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  M );.        rc 
335f0 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  |= addToSavepoin
33600 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
33610 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
33620 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33640 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
33650 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
33660 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33670 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
33680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33690 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
336a0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
336b0 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20  ITER_DBMOD ){.  
336c0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
336d0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
336e0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d  _SYNC;.        }
336f0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
33700 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
33710 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
33720 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
33730 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
33740 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
33750 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
33760 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
33770 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
33780 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d  ?1:0)));.      }
33790 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
337a0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
337b0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
337c0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
337d0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
337e0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
337f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
33800 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
33810 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
33820 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
33830 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
33840 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
33850 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
33860 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
33870 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
33880 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
33890 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
338a0 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
338b0 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
338c0 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
338d0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
338e0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
338f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
33900 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
33910 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
33920 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
33930 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
33940 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
33950 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
33960 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a   pPg->pgno;.  }.
33970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33980 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
33990 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
339a0 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ble. This routin
339b0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
339c0 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69   before .** maki
339d0 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ng changes to a 
339e0 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72  page. The caller
339f0 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
33a00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a  return value .**
33a10 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
33a20 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  n and be careful
33a30 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61   not to change a
33a40 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c  ny page data unl
33a50 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ess .** this rou
33a60 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
33a70 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
33a80 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
33a90 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
33aa0 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
33ab0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
33ac0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
33ad0 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
33ae0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
33af0 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
33b00 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
33b10 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
33b20 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
33b30 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
33b40 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
33b50 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
33b60 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
33b70 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
33b80 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
33b90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
33ba0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  , SQLITE_NOMEM o
33bb0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
33bc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
33bd0 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  * as appropriate
33be0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
33bf0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
33c00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33c10 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
33c20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33c30 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
33c40 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
33c50 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
33c60 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
33c70 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
33c80 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
33c90 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
33ca0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
33cb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
33cc0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
33cd0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
33ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33cf0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
33d00 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
33d10 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
33d20 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
33d30 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
33d40 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
33d50 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
33d60 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
33d70 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
33d80 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
33d90 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
33da0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
33db0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
33dc0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
33dd0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
33de0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
33df0 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20   nPage = 0;     
33e00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33e10 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
33e20 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
33e30 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
33e40 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
33e50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
33e60 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
33e70 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
33e80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
33e90 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
33ea0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
33eb0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
33ec0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
33ed0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
33ee0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
33ef0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20  annot allow.    
33f00 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ** a journal hea
33f10 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
33f20 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
33f30 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
33f40 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
33f50 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
33f60 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
33f70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
33f80 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
33f90 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  cSpill==0 );.   
33fa0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
33fb0 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20  ncSpill++;..    
33fc0 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
33fd0 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
33fe0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
33ff0 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
34000 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
34010 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
34020 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
34030 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
34040 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
34050 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
34060 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
34070 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
34080 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
34090 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
340a0 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
340b0 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
340c0 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70    nPageCount = p
340d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
340e0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
340f0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
34100 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
34110 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
34120 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
34130 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
34140 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
34150 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
34160 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
34170 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
34180 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
34190 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
341a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
341b0 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
341c0 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
341d0 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
341e0 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
341f0 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
34200 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
34210 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
34220 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
34230 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
34240 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
34250 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  age;.      if( p
34260 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
34270 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
34280 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
34290 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
342a0 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
342b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
342c0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
342d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
342e0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
342f0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
34300 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34320 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
34330 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
34340 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
34350 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
34360 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
34370 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
34380 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
34390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
343a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
343b0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
343c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
343d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
343e0 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
343f0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
34400 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20  r, pg))!=0 ){.  
34410 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
34420 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34430 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
34440 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
34450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34460 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34470 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
34480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
34490 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52   /* If the PGHDR
344a0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
344b0 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
344c0 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
344d0 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
344e0 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
344f0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
34500 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
34510 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
34520 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
34530 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
34540 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
34550 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
34560 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
34570 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
34580 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
34590 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  es of all of the
345a0 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  m.    ** before 
345b0 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20  any of them can 
345c0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  be written out t
345d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
345e0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
345f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34600 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b  K && needSync ){
34610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
34620 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66  MEMDB );.      f
34630 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
34640 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
34650 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
34660 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
34670 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
34680 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
34690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
346a0 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
346b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
346c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
346d0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
346e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
346f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
34700 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34710 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
34720 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
34730 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d  >doNotSyncSpill-
34740 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
34750 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
34760 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
34770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34780 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
34790 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
347a0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
347b0 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
347c0 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
347d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
347e0 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
347f0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
34800 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
34810 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
34820 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
34830 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
34840 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
34850 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34860 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
34870 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61   return pPg->fla
34880 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a  gs&PGHDR_DIRTY;.
34890 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
348a0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
348b0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
348c0 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
348d0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
348e0 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
348f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
34900 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20  age pPg back to 
34910 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
34920 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
34930 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
34940 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68  ed as dirty.  Th
34950 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
34960 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a  example, when.**
34970 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
34980 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65  en added as a le
34990 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  af of the freeli
349a0 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a  st and so its.**
349b0 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67   content no long
349c0 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a  er matters..**.*
349d0 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
349e0 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
349f0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
34a00 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
34a10 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
34a20 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
34a30 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72  nused. The pager
34a40 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
34a50 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
34a60 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
34a70 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
34a80 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
34a90 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
34aa0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
34ab0 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
34ac0 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a  peed of large .*
34ad0 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  * DELETE operati
34ae0 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ons..*/.void sql
34af0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
34b00 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
34b10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
34b20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
34b30 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73   if( (pPg->flags
34b40 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26  &PGHDR_DIRTY) &&
34b50 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
34b60 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41  int==0 ){.    PA
34b70 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f  GERTRACE(("DONT_
34b80 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
34b90 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
34ba0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
34bb0 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  r)));.    IOTRAC
34bc0 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
34bd0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
34be0 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d  >pgno)).    pPg-
34bf0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
34c00 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64  DONT_WRITE;.#ifd
34c10 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
34c20 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
34c30 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
34c40 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
34c50 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
34c60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
34c70 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
34c80 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
34c90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
34ca0 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65   file .** change
34cb0 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64  -counter, stored
34cc0 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67   as a 4-byte big
34cd0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
34ce0 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20  starting at .** 
34cf0 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f  byte offset 24 o
34d00 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
34d10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
34d20 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
34d30 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
34d40 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
34d50 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
34d60 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
34d70 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
34d80 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
34d90 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
34da0 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
34db0 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
34dc0 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
34dd0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
34de0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
34df0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
34e00 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
34e10 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f  tMode flag may o
34e20 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  nly be non-zero 
34e30 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77  if the library w
34e40 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77  as compiled.** w
34e50 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45  ith the SQLITE_E
34e60 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
34e70 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  TE macro defined
34e80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
34e90 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69  ** if isDirect i
34ea0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
34eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34ec0 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69  le is updated di
34ed0 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69  rectly.** by wri
34ee0 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20  ting an updated 
34ef0 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
34f00 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  1 using a call t
34f10 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  o the .** sqlite
34f20 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74  3OsWrite() funct
34f30 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
34f40 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
34f50 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
34f60 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
34f70 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20  sDirectMode){.  
34f80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34f90 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
34fa0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34fb0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
34fc0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
34fd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34fe0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
34ff0 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
35000 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
35010 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
35020 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64    /* Declare and
35030 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73   initialize cons
35040 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73  tant integer 'is
35050 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a  Direct'. If the.
35060 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74    ** atomic-writ
35070 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
35080 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69  s enabled in thi
35090 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73  s build, then is
350a0 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69  Direct.  ** is i
350b0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
350c0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
350d0 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  s the isDirectMo
350e0 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  de parameter.  *
350f0 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
35100 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  on. Otherwise, i
35110 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  t is always set 
35120 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
35130 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
35140 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69  hat if the atomi
35150 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
35160 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  tion is not.  **
35170 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
35180 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f  ile time, the co
35190 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20  mpiler can omit 
351a0 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a  the tests of.  *
351b0 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c  * 'isDirect' bel
351c0 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74  ow, as well as t
351d0 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65  he block enclose
351e0 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69  d in the.  ** "i
351f0 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63  f( isDirect )" c
35200 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  ondition..  */.#
35210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
35220 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
35230 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  E.# define DIREC
35240 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72  T_MODE 0.  asser
35250 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d  t( isDirectMode=
35260 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
35270 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63  ARAMETER(isDirec
35280 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20  tMode);.#else.# 
35290 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
352a0 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a  DE isDirectMode.
352b0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70  #endif..  if( !p
352c0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
352d0 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72  ntDone && pPager
352e0 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
352f0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
35300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35310 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
35320 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33  page 1 */.    u3
35330 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
35340 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
35350 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
35360 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
35370 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ield */..    ass
35380 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
35390 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e  mpFile && isOpen
353a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
353b0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
353c0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
353d0 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
353e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
353f0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
35400 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
35410 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72    assert( pPgHdr
35420 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
35430 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
35440 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20  If page one was 
35450 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66  fetched successf
35460 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66  ully, and this f
35470 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  unction is not. 
35480 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20     ** operating 
35490 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20  in direct-mode, 
354a0 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74  make page 1 writ
354b0 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20  able.  When not 
354c0 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  in .    ** direc
354d0 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69  t mode, page 1 i
354e0 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e  s always held in
354f0 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65   cache and hence
35500 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a   the PagerGet().
35510 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20      ** above is 
35520 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75  always successfu
35530 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c  l - hence the AL
35540 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49  WAYS on rc==SQLI
35550 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20  TE_OK..    */.  
35560 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f    if( !DIRECT_MO
35570 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d  DE && ALWAYS(rc=
35580 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20  =SQLITE_OK) ){. 
35590 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
355a0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
355b0 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dr);.    }..    
355c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
355d0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  K ){.      /* In
355e0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
355f0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
35600 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
35610 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
35620 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
35630 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
35640 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
35650 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
35660 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
35670 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33  er++;.      put3
35680 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
35690 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c  gHdr->pData)+24,
356a0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
356b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f  ;..      /* Also
356c0 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
356d0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
356e0 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
356f0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a   and in.      **
35700 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
35710 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
35720 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
35730 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
35740 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ber.      ** is 
35750 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20  valid. */.      
35760 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
35770 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
35780 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +92, change_coun
35790 74 65 72 29 3b 0a 20 20 20 20 20 20 70 75 74 33  ter);.      put3
357a0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
357b0 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c  gHdr->pData)+96,
357c0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
357d0 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20  NUMBER);..      
357e0 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  /* If running in
357f0 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72   direct mode, wr
35800 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
35810 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68   of page 1 to th
35820 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
35830 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45   if( DIRECT_MODE
35840 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
35850 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20  t void *zBuf;.  
35860 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
35870 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
35880 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  >0 );.        CO
35890 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
358a0 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36  Hdr->pData, 1, 6
358b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
358c0 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  M, zBuf);.      
358d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
358e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
358f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
35900 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
35910 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
35920 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
35930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
35940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
35960 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
35970 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
35980 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
35990 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
359a0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
359b0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
359c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
359d0 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
359e0 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
359f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35a00 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20  f(pPgHdr);.  }. 
35a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35a20 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
35a30 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
35a40 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
35a50 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
35a60 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  files.** or page
35a70 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
35a80 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
35a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
35aa0 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64  ssful, or called
35ab0 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20   on a pager for 
35ac0 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f  which it is a no
35ad0 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  -op, this.** fun
35ae0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
35af0 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
35b00 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  se, an IO error 
35b10 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
35b20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
35b30 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
35b40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
35b50 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
35b80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  */.  assert( !ME
35b90 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
35ba0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
35bb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
35bc0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
35bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
35be0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
35bf0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
35c00 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
35c10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
35c20 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
35c30 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
35c40 68 69 6c 65 20 61 20 77 72 69 74 65 2d 74 72 61  hile a write-tra
35c50 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
35c60 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ve in.** rollbac
35c70 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63  k. If the connec
35c80 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d  tion is in WAL m
35c90 6f 64 65 2c 20 74 68 69 73 20 63 61 6c 6c 20 69  ode, this call i
35ca0 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f  s a no-op. .** O
35cb0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
35cc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73   connection does
35cd0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 61 76   not already hav
35ce0 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
35cf0 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64  ock on .** the d
35d00 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
35d10 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
35d20 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a   to obtain one..
35d30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 43  **.** If the EXC
35d40 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61  LUSIVE lock is a
35d50 6c 72 65 61 64 79 20 68 65 6c 64 20 6f 72 20 74  lready held or t
35d60 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  he attempt to ob
35d70 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75  tain it is.** su
35d80 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 74 68 65  ccessful, or the
35d90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
35da0 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49  n WAL mode, SQLI
35db0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
35dc0 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  d..** Otherwise,
35dd0 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 42   either SQLITE_B
35de0 55 53 59 20 6f 72 20 61 6e 20 53 51 4c 49 54 45  USY or an SQLITE
35df0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
35e00 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
35e10 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
35e20 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
35e30 69 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  iveLock(Pager *p
35e40 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
35e50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
35e60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35e70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
35e80 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20  ITER_CACHEMOD . 
35e90 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
35ea0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35eb0 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20  RITER_DBMOD .   
35ec0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
35ed0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35ee0 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b  TER_LOCKED .  );
35ef0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
35f00 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
35f10 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20 30  ager) );.  if( 0
35f20 3d 3d 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ==pagerUseWal(pP
35f30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
35f40 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
35f50 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
35f60 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
35f70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
35f80 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
35f90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
35fa0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
35fb0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
35fc0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
35fd0 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
35fe0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
35ff0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
36000 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
36010 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
36020 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
36030 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
36040 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
36050 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
36060 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
36070 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
36080 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
36090 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
360a0 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a  sures that:.**.*
360b0 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
360c0 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63  se file change-c
360d0 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65  ounter is update
360e0 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f  d,.**   * the jo
360f0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
36100 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d  (unless the atom
36110 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
36120 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a  ation is used),.
36130 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79  **   * all dirty
36140 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
36150 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
36160 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a  se file, .**   *
36170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36180 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
36190 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61  (if required), a
361a0 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  nd.**   * the da
361b0 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
361c0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ed. .**.** The o
361d0 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72  nly thing that r
361e0 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
361f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
36200 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20   is to finalize 
36210 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75  .** (delete, tru
36220 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
36230 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29  e first part of)
36240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36250 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65  e (or .** delete
36260 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
36270 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
36280 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
36290 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
362a0 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
362b0 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
362c0 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
362d0 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
362e0 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  an sqlite3PagerC
362f0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
36300 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  call..**.** If t
36310 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
36320 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73  er - noSync - is
36330 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
36340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
36350 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73  self.** is not s
36360 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  ynced. The calle
36370 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  r must call sqli
36380 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64  te3PagerSync() d
36390 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79  irectly to.** sy
363a0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
363b0 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
363c0 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54  ing CommitPhaseT
363d0 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74  wo() to delete t
363e0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
363f0 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
36400 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
36410 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
36420 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ne(.  Pager *pPa
36430 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
36440 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
36450 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
36460 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
36470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
36480 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d   not NULL, the m
36490 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
364a0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79  me */.  int noSy
364b0 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
364c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
364d0 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e  to omit the xSyn
364e0 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  c on the db file
364f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
36500 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
36510 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
36520 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
36530 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36540 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36550 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
36560 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
36570 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36580 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
36590 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
365a0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
365b0 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
365c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
365d0 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
365e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
365f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36600 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
36610 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  If a prior error
36620 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72   occurred, repor
36630 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61  t that error aga
36640 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  in. */.  if( NEV
36650 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
36660 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
36670 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
36680 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41   PAGERTRACE(("DA
36690 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
366a0 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
366b0 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20  nSize=%d\n", .  
366c0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
366d0 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
366e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29  pPager->dbSize))
366f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61  ;..  /* If no da
36700 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 68  tabase changes h
36710 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 72  ave been made, r
36720 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a  eturn early. */.
36730 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
36740 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
36750 52 5f 43 41 43 48 45 4d 4f 44 20 29 20 72 65 74  R_CACHEMOD ) ret
36760 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
36770 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
36780 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
36790 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
367a0 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
367b0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
367c0 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20  to, or this.    
367d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
367e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
367f0 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c  led, it is mostl
36800 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65  y a no-op.  Howe
36810 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20  ver, any.    ** 
36820 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65  backup in progre
36830 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ss needs to be r
36840 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f  estarted..    */
36850 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b  .    sqlite3Back
36860 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
36870 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65  ->pBackup);.  }e
36880 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61 67  lse{.    if( pag
36890 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
368a0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
368b0 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
368c0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
368d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
368e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
368f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
36900 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
36910 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20  (pPager, pList, 
36920 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20  pPager->dbSize, 
36930 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
36940 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e  (pPager->fullSyn
36950 63 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  c ? pPager->sync
36960 5f 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20  _flags : 0).    
36970 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
36980 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
369a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
369b0 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
369c0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20  pPCache);.      
369d0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
369e0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
369f0 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  ing block update
36a00 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
36a10 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f  nter. Exactly ho
36a20 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f  w it.      ** do
36a30 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
36a40 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
36a50 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
36a60 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
36a70 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  .      ** was en
36a80 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
36a90 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
36aa0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
36ab0 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20  eets the .      
36ac0 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65  ** runtime crite
36ad0 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f  ria to use the o
36ae0 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20  peration: .     
36af0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
36b00 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * The file-syste
36b10 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
36b20 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
36b30 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  erty for.      *
36b40 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
36b50 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
36b60 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20   and .      **  
36b70 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    * This commit 
36b80 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
36b90 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
36ba0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
36bb0 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74     **    * Exact
36bc0 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
36bd0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
36be0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
36bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
36c00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
36c10 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
36c20 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
36c30 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
36c40 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
36c50 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
36c60 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
36c70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
36c80 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  led to update th
36c90 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a  e change.      *
36ca0 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e  * counter in 'in
36cb0 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66  direct-mode'. If
36cc0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
36cd0 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  n is compiled in
36ce0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73   but.      ** is
36cf0 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20   not applicable 
36d00 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  to this transact
36d10 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  ion, call sqlite
36d20 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29  3JournalCreate()
36d30 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  .      ** to mak
36d40 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e  e sure the journ
36d50 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75  al file has actu
36d60 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65  ally been create
36d70 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20  d, then call.   
36d80 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
36d90 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
36da0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
36db0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e  hange-counter in
36dc0 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20   indirect.      
36dd0 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20  ** mode. .      
36de0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  **.      ** Othe
36df0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
36e00 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
36e10 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
36e20 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20  pplicable,.     
36e30 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61   ** then call pa
36e40 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
36e50 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
36e60 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
36e70 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  unter.      ** i
36e80 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e  n 'direct' mode.
36e90 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
36ea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
36eb0 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20  ill never be.   
36ec0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f     ** created fo
36ed0 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
36ee0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23  on..      */.  #
36ef0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
36f00 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
36f10 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
36f20 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  g;.      assert(
36f30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
36f40 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
36f50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
36f60 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
36f70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
36f80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
36f90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
36fa0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
36fb0 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
36fc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
36fd0 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
36fe0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
36ff0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
37000 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c  journalOff==jrnl
37010 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
37020 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  r) .       && pP
37030 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50  ager->dbSize>=pP
37040 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
37050 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28  .       && (0==(
37060 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
37070 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
37080 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c  ger->pPCache)) |
37090 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79  | 0==pPg->pDirty
370a0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
370b0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
370c0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
370d0 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20  counter via the 
370e0 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74  direct-write met
370f0 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20  hod. The .      
37100 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
37110 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
37120 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
37130 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
37140 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20  page 1 .        
37150 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ** to include th
37160 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65  e updated change
37170 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
37180 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a  n write page 1 .
37190 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63          ** direc
371a0 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
371b0 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
371c0 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
371d0 77 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a  write .        *
371e0 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  * property of th
371f0 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
37200 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65  em, this is safe
37210 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
37220 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
37230 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
37240 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
37250 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37270 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
37280 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
37290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
372a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
372b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
372c0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
372d0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
372e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
372f0 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20   #else.      rc 
37300 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
37310 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
37320 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a  r, 0);.  #endif.
37330 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37340 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
37350 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
37360 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f  exit;.  .      /
37370 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
37380 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
37390 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
373a0 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
373b0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  ges.      ** bei
373c0 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
373d0 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
373e0 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
373f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
37400 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69      ** file. Thi
37410 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
37420 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
37430 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   mode..      **.
37440 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20        ** Before 
37450 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65  reading the page
37460 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
37470 65 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ers larger than 
37480 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75  the .      ** cu
37490 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
374a0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74  ager.dbSize, set
374b0 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20   dbSize back to 
374c0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
374d0 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20  ** that it took 
374e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
374f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
37500 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
37510 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74        ** calls t
37520 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
37530 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65  t() return zeroe
37540 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20  d pages instead 
37550 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  of .      ** rea
37560 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74  ding data from t
37570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37580 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66  ..      */.  #if
37590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
375a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
375b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
375c0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f  Size<pPager->dbO
375d0 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20  rigSize .       
375e0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
375f0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
37600 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20  URNALMODE_OFF.  
37610 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50      ){.        P
37620 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20  gno i;          
37630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37640 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
37650 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
37660 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50  .        const P
37670 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
37680 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
37690 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
376a0 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
376b0 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62     const Pgno db
376c0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
376d0 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  bSize;       /* 
376e0 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73  Database image s
376f0 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  ize */ .        
37700 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
37710 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
37720 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ize;.        for
37730 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c  ( i=dbSize+1; i<
37740 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
37750 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
37760 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
37770 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
37780 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
37790 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
377a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 50  ){.            P
377b0 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20  gHdr *pPage;    
377c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
377d0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
377e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
377f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
37800 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
37810 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
37820 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37830 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
37840 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
37850 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
37860 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37870 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
37880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
37890 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
378a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
378b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
378c0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
378d0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
378e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
378f0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
37900 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69  r->dbSize = dbSi
37910 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 23  ze;.      } .  #
37920 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 20 20 2f  endif.  .      /
37930 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
37940 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
37950 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
37960 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74   file. If a mast
37970 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  er .      ** jou
37980 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
37990 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
379a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
379b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20  ournal file, .  
379c0 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61      ** or if zMa
379d0 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f  ster is NULL (no
379e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29   master journal)
379f0 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
37a00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
37a10 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
37a20 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
37a30 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
37a40 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
37a50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37a60 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
37a70 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
37a80 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65       /* Sync the
37a90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
37aa0 64 20 77 72 69 74 65 20 61 6c 6c 20 64 69 72 74  d write all dirt
37ab0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
37ac0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
37ad0 2a 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  * If the atomic-
37ae0 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74  update optimizat
37af0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 75 73 65  ion is being use
37b00 64 2c 20 74 68 69 73 20 73 79 6e 63 20 77 69 6c  d, this sync wil
37b10 6c 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20  l not .      ** 
37b20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  create the journ
37b30 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f  al file or perfo
37b40 72 6d 20 61 6e 79 20 72 65 61 6c 20 49 4f 2e 0a  rm any real IO..
37b50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
37b60 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 63 68  * Because the ch
37b70 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 70 61 67  ange-counter pag
37b80 65 20 77 61 73 20 6a 75 73 74 20 6d 6f 64 69 66  e was just modif
37b90 69 65 64 2c 20 75 6e 6c 65 73 73 20 74 68 65 0a  ied, unless the.
37ba0 20 20 20 20 20 20 2a 2a 20 61 74 6f 6d 69 63 2d        ** atomic-
37bb0 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74  update optimizat
37bc0 69 6f 6e 20 69 73 20 75 73 65 64 20 69 74 20 69  ion is used it i
37bd0 73 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  s almost certain
37be0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
37bf0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 72 65 71 75 69  ** journal requi
37c00 72 65 73 20 61 20 73 79 6e 63 20 68 65 72 65 2e  res a sync here.
37c10 20 48 6f 77 65 76 65 72 2c 20 69 6e 20 6c 6f 63   However, in loc
37c20 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
37c30 69 76 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ive.      ** on 
37c40 61 20 73 79 73 74 65 6d 20 75 6e 64 65 72 20 6d  a system under m
37c50 65 6d 6f 72 79 20 70 72 65 73 73 75 72 65 20 69  emory pressure i
37c60 74 20 69 73 20 6a 75 73 74 20 70 6f 73 73 69 62  t is just possib
37c70 6c 65 20 74 68 61 74 20 74 68 69 73 20 69 73 20  le that this is 
37c80 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 68  .      ** not th
37c90 65 20 63 61 73 65 2e 20 49 6e 20 74 68 69 73 20  e case. In this 
37ca0 63 61 73 65 20 69 74 20 69 73 20 6c 69 6b 65 6c  case it is likel
37cb0 79 20 65 6e 6f 75 67 68 20 74 68 61 74 20 74 68  y enough that th
37cc0 65 20 72 65 64 75 6e 64 61 6e 74 0a 20 20 20 20  e redundant.    
37cd0 20 20 2a 2a 20 78 53 79 6e 63 28 29 20 63 61 6c    ** xSync() cal
37ce0 6c 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  l will be change
37cf0 64 20 74 6f 20 61 20 6e 6f 2d 6f 70 20 62 79 20  d to a no-op by 
37d00 74 68 65 20 4f 53 20 61 6e 79 68 6f 77 2e 20 0a  the OS anyhow. .
37d10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
37d20 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
37d30 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
37d40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37d50 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
37d60 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
37d70 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20  ;.  .      rc = 
37d80 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
37d90 6c 69 73 74 28 70 50 61 67 65 72 2c 73 71 6c 69  list(pPager,sqli
37da0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
37db0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
37dc0 68 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  he));.      if( 
37dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37de0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37df0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
37e00 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
37e10 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74       goto commit
37e20 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
37e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
37e40 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
37e50 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
37e60 61 63 68 65 29 3b 0a 20 20 0a 20 20 20 20 20 20  ache);.  .      
37e70 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  /* If the file o
37e80 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68  n disk is not th
37e90 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74  e same size as t
37ea0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
37eb0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
37ec0 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63   use pager_trunc
37ed0 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73  ate to grow or s
37ee0 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68  hrink the file h
37ef0 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
37f00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
37f10 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  dbSize!=pPager->
37f20 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
37f30 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20        Pgno nNew 
37f40 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
37f50 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69   - (pPager->dbSi
37f60 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ze==PAGER_MJ_PGN
37f70 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  O(pPager));.    
37f80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
37f90 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37fa0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
37fb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
37fc0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
37fd0 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  ager, nNew);.   
37fe0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37ff0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
38000 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
38010 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  xit;.      }.  .
38020 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79        /* Finally
38030 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
38040 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
38050 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
38060 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e  noSync && !noSyn
38070 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
38080 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
38090 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
380a0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
380b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49  .      }.      I
380c0 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
380d0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
380e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 63 6f 6d 6d 69      }.  }..commi
380f0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
38100 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
38110 54 45 5f 4f 4b 20 26 26 20 21 70 61 67 65 72 55  TE_OK && !pagerU
38120 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
38130 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
38140 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
38150 45 52 5f 46 49 4e 49 53 48 45 44 3b 0a 20 20 7d  ER_FINISHED;.  }
38160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
38170 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
38180 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
38190 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61  lled, the databa
381a0 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
381b0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75   completely.** u
381c0 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
381d0 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  t the changes ma
381e0 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  de by the curren
381f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  t transaction an
38200 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64  d.** synced to d
38210 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  isk. The journal
38220 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
38230 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ts in the file-s
38240 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68  ystem .** though
38250 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75  , and if a failu
38260 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  re occurs at thi
38270 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20  s point it will 
38280 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65  eventually.** be
38290 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a   used as a hot-j
382a0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63  ournal and the c
382b0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
382c0 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  on rolled back..
382d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
382e0 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68  ion finalizes th
382f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
38300 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69  either by deleti
38310 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  ng, .** truncati
38320 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  ng or partially 
38330 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74  zeroing it, so t
38340 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
38350 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f   used .** for ho
38360 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
38370 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73  ck. Once this is
38380 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61   done the transa
38390 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65  ction is.** irre
383a0 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65  vocably committe
383b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
383c0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
383d0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
383e0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
383f0 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73  e pager.** moves
38400 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
38410 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
38420 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
38430 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
38440 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
38450 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
38460 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
38470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
38480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38490 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
384a0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
384b0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
384c0 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 61  t be called if a
384d0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61 73   prior error has
384e0 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
384f0 42 75 74 20 69 66 20 28 64 75 65 20 74 6f 20 61  But if (due to a
38500 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65 6c   coding error el
38510 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 73  sewhere in the s
38520 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20 67  ystem) it does g
38530 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  et.  ** called, 
38540 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  just return the 
38550 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  same error code 
38560 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
38570 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  ything. */.  if(
38580 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
38590 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
385a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
385b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
385c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
385d0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
385e0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
385f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
38600 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
38610 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 61 67 65  .       || (page
38620 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
38630 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
38640 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38650 43 41 43 48 45 4d 4f 44 29 0a 20 20 29 3b 0a 20  CACHEMOD).  );. 
38660 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
38670 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
38680 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  er) );..  /* An 
38690 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
386a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
386b0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
386c0 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
386d0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
386e0 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
386f0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
38700 63 6c 75 73 69 76 65 2