/ Hex Artifact Content
Login

Artifact 13780cd829f48fbb4cbedc76b4d9185315861ea3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53 68 61  .  u8 hasHeldSha
7920: 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20 20 2f  redLock;       /
7930: 2a 20 54 72 75 65 20 69 66 20 61 20 73 68 61 72  * True if a shar
7940: 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76 65 72  ed lock has ever
7950: 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a 20 20   been held */.  
7960: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
7970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7980: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7990: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
79a0: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
79b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
79c0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
79d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
79e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
79f0: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7a10: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a30: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69  e */.  Pgno dbHi
7a40: 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
7a50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73     /* Value pass
7a60: 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45  ed to FCNTL_SIZE
7a70: 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20  _HINT call */.  
7a80: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7aa0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
7ab0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
7ac0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
7af0: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
7b00: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
7b10: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
7b20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7b30: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
7b40: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
7b50: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
7b60: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
7b90: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
7ba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7bb0: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
7bc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
7bd0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
7be0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
7bf0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66  base file */.#if
7c00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7c10: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 42 69  _CONCURRENT.  Bi
7c20: 74 76 65 63 20 2a 70 41 6c 6c 52 65 61 64 3b 20  tvec *pAllRead; 
7c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7c40: 65 73 20 72 65 61 64 20 77 69 74 68 69 6e 20 63  es read within c
7c50: 75 72 72 65 6e 74 20 43 4f 4e 43 55 52 52 45 4e  urrent CONCURREN
7c60: 54 20 74 72 61 6e 73 2e 20 2a 2f 0a 23 65 6e 64  T trans. */.#end
7c70: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  if.  sqlite3_fil
7c80: 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20 20  e *fd;          
7c90: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
7ca0: 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73 65  tor for database
7cb0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7cc0: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
7cd0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7ce0: 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f  ptor for main jo
7cf0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74  urnal */.  sqlit
7d00: 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20  e3_file *sjfd;  
7d10: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7d20: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73 75  escriptor for su
7d30: 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  b-journal */.  i
7d40: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
7d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7d60: 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66 73  rrent write offs
7d70: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
7d80: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
7d90: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
7da0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
7db0: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
7dc0: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
7dd0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  r */.  sqlite3_b
7de0: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20  ackup *pBackup; 
7df0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7e00: 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67   list of ongoing
7e10: 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
7e20: 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65  s */.  PagerSave
7e30: 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e  point *aSavepoin
7e40: 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61  t; /* Array of a
7e50: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
7e60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70   */.  int nSavep
7e70: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  oint;           
7e80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
7e90: 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65  lements in aSave
7ea0: 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 75 33 32  point[] */.  u32
7eb0: 20 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 20 20   iDataVersion;  
7ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e           /* Chan
7ed0: 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74  ges whenever dat
7ee0: 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 63 68  abase content ch
7ef0: 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  anges */.  char 
7f00: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
7f10: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
7f20: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
7f30: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
7f40: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d 6d 61 70   */..  int nMmap
7f50: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
7f60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7f70: 6d 6d 61 70 20 70 61 67 65 73 20 63 75 72 72 65  mmap pages curre
7f80: 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  ntly outstanding
7f90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
7fa0: 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20 20 20 20  t64 szMmap;     
7fb0: 20 20 2f 2a 20 44 65 73 69 72 65 64 20 6d 61 78    /* Desired max
7fc0: 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 2a  imum mmap size *
7fd0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d 6d 61 70  /.  PgHdr *pMmap
7fe0: 46 72 65 65 6c 69 73 74 3b 20 20 20 20 20 20 20  Freelist;       
7ff0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
8000: 6d 6d 61 70 20 70 61 67 65 20 68 65 61 64 65 72  mmap page header
8010: 73 20 28 70 44 69 72 74 79 29 20 2a 2f 0a 20 20  s (pDirty) */.  
8020: 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74  /*.  ** End of t
8030: 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61  he routinely-cha
8040: 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62  nging class memb
8050: 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ers.  **********
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80a0: 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61  */..  u16 nExtra
80b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
80c0: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
80d0: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
80e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
80f0: 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76  */.  i16 nReserv
8100: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8110: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
8120: 75 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e  used bytes at en
8130: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a  d of each page *
8140: 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73  /.  u32 vfsFlags
8150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8160: 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c  /* Flags for sql
8170: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
8180: 20 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72   */.  u32 sector
8190: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
81a0: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
81b0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
81c0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  rollback */.  in
81d0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
81e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
81f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
8200: 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  a page */.  Pgno
8210: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
8220: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
8230: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
8240: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
8250: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
8260: 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20  SizeLimit;      
8270: 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66   /* Size limit f
8280: 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  or persistent jo
8290: 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20  urnal files */. 
82a0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
82b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
82c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
82d0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
82e0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
82f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
8300: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
8310: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
8320: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
8330: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
8340: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
8350: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
8360: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
8370: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
8380: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
8390: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  BusyHandler */. 
83a0: 20 69 6e 74 20 61 53 74 61 74 5b 33 5d 3b 20 20   int aStat[3];  
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83c0: 54 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73  Total cache hits
83d0: 2c 20 6d 69 73 73 65 73 20 61 6e 64 20 77 72 69  , misses and wri
83e0: 74 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  tes */.#ifdef SQ
83f0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
8400: 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
8410: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
8420: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a  ase pages read *
8430: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
8440: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
8450: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
8460: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
8470: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
8480: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
8490: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
84a0: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
84b0: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
84c0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
84d0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
84e0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28  data */.  void (
84f0: 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29  *xCodecSizeChng)
8500: 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b  (void*,int,int);
8510: 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61   /* Notify of pa
8520: 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  ge size changes 
8530: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8540: 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20  ecFree)(void*); 
8550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8560: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
8570: 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69  e codec */.  voi
8580: 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20  d *pCodec;      
8590: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
85a0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
85b0: 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20  odec... methods 
85c0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
85d0: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
85e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
85f0: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
8600: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
8610: 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65   use */.  PCache
8620: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
8630: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8640: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
8650: 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66  bject */.#ifndef
8660: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
8670: 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20  .  Wal *pWal;   
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8690: 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  * Write-ahead lo
86a0: 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e  g used by "journ
86b0: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a  al_mode=wal" */.
86c0: 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20    char *zWal;   
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86e0: 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77   File name for w
86f0: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a  rite-ahead log *
8700: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8710: 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72 20 75  ** Indexes for u
8720: 73 65 20 77 69 74 68 20 50 61 67 65 72 2e 61 53  se with Pager.aS
8730: 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67 65 72  tat[]. The Pager
8740: 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79 20 63  .aStat[] array c
8750: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76  ontains.** the v
8760: 61 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62  alues accessed b
8770: 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49 54 45  y passing SQLITE
8780: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
8790: 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53 53 20  HIT, CACHE_MISS 
87a0: 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57 52 49  .** or CACHE_WRI
87b0: 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 62  TE to sqlite3_db
87c0: 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64  _status()..*/.#d
87d0: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
87e0: 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69 6e 65  _HIT   0.#define
87f0: 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53   PAGER_STAT_MISS
8800: 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45    1.#define PAGE
8810: 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32 0a 0a  R_STAT_WRITE 2..
8820: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
8830: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
8840: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
8850: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
8860: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
8870: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
8880: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
8890: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
88a0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
88b0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
88c0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
88d0: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
88e0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
88f0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
8900: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
8910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8920: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
8930: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
8940: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
8950: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
8960: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
8970: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
8980: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
8990: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
89a0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
89b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
89c0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
89d0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
89e0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
89f0: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
8a00: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8a10: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
8a20: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
8a30: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
8a40: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
8a50: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
8a60: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
8a70: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
8a80: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
8a90: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
8aa0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
8ab0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
8ac0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
8ad0: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
8ae0: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
8af0: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
8b00: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
8b10: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
8b20: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
8b30: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
8b40: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
8b50: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
8b60: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
8b70: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
8b80: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
8b90: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
8ba0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
8bb0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
8bc0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
8bd0: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
8be0: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
8bf0: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
8c00: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
8c10: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
8c20: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
8c30: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
8c40: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
8c50: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
8c60: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
8c70: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
8c80: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
8c90: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
8ca0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
8cb0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
8cc0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
8cd0: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
8ce0: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
8cf0: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
8d00: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
8d10: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8d20: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
8d30: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
8d40: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
8d50: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
8d60: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
8d70: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
8d80: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
8d90: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
8da0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
8db0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
8dc0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
8dd0: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
8de0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
8df0: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
8e00: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
8e10: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
8e20: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
8e30: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
8e40: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
8e50: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
8e60: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
8e70: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
8e80: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
8e90: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
8ea0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
8eb0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
8ec0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
8ed0: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
8ee0: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
8ef0: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
8f00: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
8f10: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
8f20: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
8f30: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
8f40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
8f50: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
8f60: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
8f70: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
8f80: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
8f90: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
8fa0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20   size of the of 
8fb0: 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64  each page record
8fc0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8fd0: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74  is given by.** t
8fe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
8ff0: 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ro..*/.#define J
9000: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
9010: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
9020: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
9030: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
9040: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
9050: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  r this pager. Th
9060: 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68  is is usually th
9070: 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20  e same .** size 
9080: 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  as a single disk
9090: 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73   sector. See als
90a0: 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  o setSectorSize(
90b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  )..*/.#define JO
90c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
90d0: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
90e0: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
90f0: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
9100: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9110: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
9120: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9130: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
9140: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
9150: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
9160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
9170: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
9180: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
9190: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
91a0: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
91b0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
91c0: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
91d0: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
91e0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
91f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9200: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
9210: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
9220: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
9230: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
9240: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
9250: 20 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46 45   The macro USEFE
9260: 54 43 48 20 69 73 20 74 72 75 65 20 69 66 20 77  TCH is true if w
9270: 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  e are allowed to
9280: 20 75 73 65 20 74 68 65 20 78 46 65 74 63 68 20   use the xFetch 
9290: 61 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20  and xUnfetch.** 
92a0: 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61 63  interfaces to ac
92b0: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
92c0: 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d  e using memory-m
92d0: 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69  apped I/O..*/.#i
92e0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
92f0: 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e  P_SIZE>0.# defin
9300: 65 20 55 53 45 46 45 54 43 48 28 78 29 20 28 28  e USEFETCH(x) ((
9310: 78 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a 23  x)->bUseFetch).#
9320: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 53  else.# define US
9330: 45 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e 64  EFETCH(x) 0.#end
9340: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
9350: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
9360: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
9370: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
9380: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
9390: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
93a0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
93b0: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
93c0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
93d0: 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33  or (type sqlite3
93e0: 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75  _file*)..** Retu
93f0: 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f  rn 0 if it is no
9400: 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a  t open, or non-z
9410: 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20  ero (but not 1) 
9420: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
9430: 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  This is so that 
9440: 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20  expressions can 
9450: 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a  be written as:.*
9460: 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65  *.**   if( isOpe
9470: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
9480: 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74  { ....**.** inst
9490: 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69  ead of.**.**   i
94a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  f( pPager->jfd->
94b0: 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a  pMethods ){ ....
94c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65  */.#define isOpe
94d0: 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70  n(pFd) ((pFd)->p
94e0: 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a  Methods!=0)../*.
94f0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
9500: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
9510: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
9520: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
9530: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
9540: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
9550: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
9560: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
9570: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
9580: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
9590: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
95a0: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
95b0: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
95c0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
95d0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
95e0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
95f0: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9600: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9610: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30  rames(v,w,x,y) 0
9620: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f  .# define pagerO
9630: 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
9640: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  z) SQLITE_OK.# d
9650: 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e  efine pagerBegin
9660: 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
9670: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
9680: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
9690: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
96a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
96b0: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
96c0: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
96d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
96e0: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
96f0: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
9700: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
9710: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
9720: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
9730: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
9740: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9750: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
9760: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
9770: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
9780: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
9790: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
97a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
97b0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
97c0: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
97d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
97e0: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
97f0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9800: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
9810: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9820: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
9830: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
9840: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9850: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
9860: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9870: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9880: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9890: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
98a0: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
98b0: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
98c0: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
98d0: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
98e0: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
98f0: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9900: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9910: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
9920: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9930: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
9940: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
9950: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
9960: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
9970: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9980: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9990: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
99a0: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
99b0: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
99c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
99d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
99e0: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
99f0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9a00: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9a10: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
9a20: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
9a40: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
9a50: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
9a60: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
9a70: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9a80: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9a90: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9aa0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9ab0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9ac0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9ad0: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9af0: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9b00: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9b10: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
9b20: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
9b30: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
9b40: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
9b50: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
9b60: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
9b70: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9b80: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9b90: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9ba0: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9bb0: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9bc0: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9bd0: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9be0: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9bf0: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9c00: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9c10: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9c20: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
9c30: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9c40: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9c50: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
9c60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
9c70: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9c80: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9c90: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9ca0: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9cb0: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9cc0: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9cd0: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9ce0: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9cf0: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9d00: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9d10: 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e  assert( p->noSyn
9d20: 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
9d30: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9d40: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9d50: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
9d60: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9d70: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9d80: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9d90: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
9da0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9db0: 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53  R_ERROR && p->eS
9dc0: 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
9dd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9de0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d  pagerUseWal(p)==
9df0: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
9e00: 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  f changeCountDon
9e10: 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45  e is set, a RESE
9e20: 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65  RVED lock or gre
9e30: 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
9e40: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69  d.  ** on the fi
9e50: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
9e60: 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  t( pPager->chang
9e70: 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c  eCountDone==0 ||
9e80: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
9e90: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c  .  assert( p->eL
9eb0: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
9ec0: 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  K );..  switch( 
9ed0: 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  p->eState ){.   
9ee0: 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e   case PAGER_OPEN
9ef0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9f00: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
9f10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9f20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9f30: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
9f40: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
9f50: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
9f60: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c  ->pPCache)==0 ||
9f70: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
9f80: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
9f90: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9fa0: 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20  R_READER:.      
9fb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9fc0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9fd0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
9fe0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9ff0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a000: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a010: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
a020: 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  K );.      break
a030: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a040: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a  R_WRITER_LOCKED:
a050: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a060: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a070: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a080: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a090: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a0a0: 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  K );.      if( !
a0b0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a0c0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  er) ){.        a
a0d0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a0e0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
a0f0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
a100: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
a110: 4e 43 55 52 52 45 4e 54 0a 20 20 20 20 20 20 61  NCURRENT.      a
a120: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a130: 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  bSize==pPager->d
a140: 62 4f 72 69 67 53 69 7a 65 20 7c 7c 20 70 50 61  bOrigSize || pPa
a150: 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 29 3b  ger->pAllRead );
a160: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 73  .#endif.      as
a170: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a180: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a190: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a1a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a1b0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a1c0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a1d0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a1e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
a1f0: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
a200: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a210: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a220: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
a230: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a240: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a250: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a260: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a270: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a280: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a290: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a2a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
a2b0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
a2c0: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
a2d0: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
a2e0: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
a2f0: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
a300: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
a310: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
a320: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
a330: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
a340: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
a350: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
a360: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
a370: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
a380: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
a390: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
a3a0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
a3b0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a3c0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a3e0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a3f0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a400: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a410: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a420: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a430: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a440: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a450: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a460: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
a470: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a480: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a490: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a4a0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a4b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a4c0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a4d0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a4f0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a500: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
a510: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a520: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a530: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a540: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a550: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a560: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a570: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a580: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a590: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
a5a0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a5c0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a5d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a5e0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a5f0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a600: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a610: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a620: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a630: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a650: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a660: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a670: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a680: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a690: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a6a0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a6b0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a6c0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a6e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a6f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a700: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a710: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a720: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a730: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a750: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a760: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a770: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a780: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a790: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a7a0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a7b0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a7c0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a7d0: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a7e0: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a7f0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a800: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a810: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a820: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a830: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a840: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a850: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a860: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a870: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a880: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a890: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a8a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a8b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a8c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a8d0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a8e0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a8f0: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a900: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a910: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a920: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a930: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a940: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a950: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a960: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a970: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a980: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a990: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a9a0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a9b0: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a9c0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a9d0: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a9e0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a9f0: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
aa00: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
aa10: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
aa20: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
aa30: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
aa40: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
aa50: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
aa60: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
aa70: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
aa80: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
aa90: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
aaa0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
aab0: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
aac0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
aad0: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
aae0: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
aaf0: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
ab00: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
ab10: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
ab20: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
ab30: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
ab40: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
ab50: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
ab60: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
ab70: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
ab80: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
ab90: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
aba0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
abb0: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
abc0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
abd0: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
abe0: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
abf0: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
ac00: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
ac10: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
ac20: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
ac30: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
ac40: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
ac50: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
ac60: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
ac70: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
ac80: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
ac90: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
aca0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
acb0: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
acc0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
acd0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
ace0: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
acf0: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
ad00: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ad10: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
ad20: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
ad30: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
ad40: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ad50: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
ad60: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
ad70: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ad80: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ad90: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
ada0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
adb0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
adc0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
add0: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
ade0: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
adf0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
ae00: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
ae10: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
ae20: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
ae30: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
ae40: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
ae50: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
ae60: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
ae70: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
ae80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
ae90: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
aea0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
aeb0: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
aec0: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
aed0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
aee0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
aef0: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
af00: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
af10: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
af20: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
af30: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
af40: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
af50: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
af60: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
af70: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
af80: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
af90: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
afa0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
afb0: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
afc0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
afd0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
afe0: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
aff0: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b000: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b010: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
b020: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
b030: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
b040: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b050: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b060: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
b070: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
b080: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b090: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b0a0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b0b0: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b0c0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b0d0: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b0e0: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b0f0: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b100: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b110: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b120: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b130: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b140: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b150: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b160: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b170: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b180: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b190: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b1a0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b1b0: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b1c0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b1d0: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b1e0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b1f0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b200: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b210: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b220: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b230: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b240: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b250: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b260: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b270: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b280: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b290: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b2a0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b2b0: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b2c0: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b2d0: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b2e0: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b2f0: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b300: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b310: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b320: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b330: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b340: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b350: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b360: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b370: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b380: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b390: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b3a0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b3b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b3c0: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b3d0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b3e0: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b3f0: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b420: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b430: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b440: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b450: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b460: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b470: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b480: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b490: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b4a0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b4b0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b4c0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b4d0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b4e0: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b4f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b500: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b510: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b520: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b530: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b540: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b550: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b560: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b570: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b580: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b590: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b5a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b5b0: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b5c0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b5d0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b5e0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b5f0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b600: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b610: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b620: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b630: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b640: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b650: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b660: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b670: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b680: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b690: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b6a0: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b6b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b6c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b6d0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b6e0: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b6f0: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b700: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b710: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b720: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b730: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b740: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b750: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b760: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b770: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b780: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b790: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b7a0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b7b0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b7c0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b7d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b7e0: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b7f0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b800: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b810: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b820: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b830: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b840: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b850: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b870: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b880: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b890: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b8a0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b8b0: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b8c0: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b8d0: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b8e0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b8f0: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b900: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b910: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b920: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b930: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b940: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b950: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b960: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b970: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b980: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b990: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b9a0: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b9b0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b9c0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b9d0: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b9e0: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b9f0: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
ba00: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ba10: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
ba20: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
ba30: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
ba40: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
ba50: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
ba60: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
ba70: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
ba80: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
ba90: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
baa0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
bab0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
bac0: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
bad0: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
bae0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
baf0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
bb00: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
bb10: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
bb20: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
bb30: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
bb40: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
bb50: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
bb60: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
bb70: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
bb80: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
bb90: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
bba0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
bbb0: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
bbc0: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
bbd0: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
bbe0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
bbf0: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
bc00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bc10: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bc20: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bc30: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bc40: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
bc50: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bc60: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bc70: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bc80: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bc90: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bca0: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bcb0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bcc0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bcd0: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bce0: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bcf0: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bd00: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bd10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bd20: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bd30: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bd40: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bd50: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bd60: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bd70: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bd80: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bd90: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bda0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bdb0: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bdc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bdd0: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bde0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bdf0: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
be00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
be10: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
be20: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
be30: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
be40: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
be50: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
be60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
be70: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
be80: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
be90: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bea0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
beb0: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
bec0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bed0: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bee0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bef0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bf00: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bf10: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bf20: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bf30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bf40: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bf50: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
bf60: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bf70: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bf80: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bf90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bfa0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bfb0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bfc0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bfd0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bfe0: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bff0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
c000: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
c010: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
c020: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
c030: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
c040: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
c050: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c060: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
c070: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
c080: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
c090: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
c0a0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c0b0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c0c0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c0d0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c0e0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c0f0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c100: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
c110: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
c120: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
c130: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
c140: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
c150: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c160: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c170: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c180: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c190: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c1a0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c1b0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c1c0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c1d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c1e0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c1f0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c200: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c210: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c230: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c240: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c250: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c260: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c270: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c280: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c290: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c2a0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c2b0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c2c0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c2d0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c2e0: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c310: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c320: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c330: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c350: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c360: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c390: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c3a0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c3b0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c3c0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c3d0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c3e0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c3f0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c400: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c410: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c420: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c430: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c440: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c450: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c460: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c470: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c480: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c490: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c4a0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c4b0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c4c0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c4d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c4e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c4f0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c500: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c510: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c520: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c530: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c540: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c550: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c560: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c570: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c580: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c590: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c5a0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c5b0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c5c0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c5d0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c5e0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c5f0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c600: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c610: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c620: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c630: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c640: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c650: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c660: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c670: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c680: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c690: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c6a0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c6b0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c6c0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c6d0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c6e0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c6f0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c700: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c710: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c720: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c730: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c740: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c750: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c760: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c770: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c780: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c790: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c7a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c7b0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c7c0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c7d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c7e0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c7f0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c800: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c810: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c820: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c830: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c840: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c850: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c860: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c870: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c880: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c890: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c8a0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c8b0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c8c0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c8d0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c8e0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c8f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c900: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c910: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c920: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c930: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c940: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c950: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c960: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c970: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c980: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c990: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c9a0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c9b0: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c9c0: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c9d0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c9e0: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c9f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
ca00: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
ca10: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
ca20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
ca30: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
ca40: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
ca50: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
ca60: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
ca70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ca80: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
ca90: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
caa0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
cab0: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
cac0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
cad0: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
cae0: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
caf0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
cb00: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
cb10: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
cb20: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
cb30: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
cb40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
cb50: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cb60: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cb70: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cb80: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cb90: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
cba0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cbb0: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cbc0: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cbd0: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cbe0: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cbf0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cc00: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cc10: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cc20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cc30: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cc40: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cc50: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cc60: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cc70: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cc80: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cc90: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cca0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
ccb0: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
ccc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
ccd0: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cce0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
ccf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cd00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cd10: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cd20: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cd30: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cd40: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cd50: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
cd60: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
cd70: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
cd80: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cd90: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
cda0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cdb0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cdc0: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cdd0: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cde0: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cdf0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
ce00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ce10: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ce20: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
ce30: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
ce40: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
ce50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
ce60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
ce70: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
ce80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ce90: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cea0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ceb0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cec0: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
ced0: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cee0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cef0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cf00: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cf10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cf20: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cf30: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cf40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cf50: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cf60: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cf70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cf80: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cfa0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cfb0: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cfc0: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cfd0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cff0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
d000: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
d010: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
d040: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d050: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
d060: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
d070: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
d080: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
d090: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
d0a0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d0b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d0c0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d0d0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d0e0: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d0f0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d100: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d110: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d120: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d130: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d140: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d150: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d160: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d170: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d180: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d190: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d1a0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d1b0: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d1c0: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d1d0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d1e0: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d1f0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d200: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d210: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d220: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d230: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d240: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d250: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d260: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d270: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d280: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d290: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d2a0: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d2b0: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d2c0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d2d0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d2e0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d2f0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d300: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d310: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d320: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d340: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d350: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d360: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d370: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d380: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d390: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d3a0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d3b0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d3c0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d3d0: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d3e0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d3f0: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d400: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d410: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d420: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d430: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d440: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d450: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d460: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d470: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d480: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d490: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d4a0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d4b0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d4c0: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d4d0: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d4e0: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d4f0: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d500: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d580: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d590: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d5a0: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d5c0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d5d0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d5e0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d5f0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d600: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d610: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d620: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d630: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d640: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d650: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d660: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d670: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d680: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d690: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d6a0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d6b0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d6c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d6d0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d6e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d6f0: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d710: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d720: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d730: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d740: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d750: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d760: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d770: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d780: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d790: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d7a0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d7b0: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d7c0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d7d0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d7e0: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d7f0: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d800: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d810: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d820: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d830: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d840: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d850: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d860: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d870: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d880: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d890: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d8a0: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d8b0: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d8c0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d8d0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d8e0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d8f0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d900: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d910: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d920: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d930: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d940: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d950: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d960: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d970: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d980: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d990: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d9a0: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d9b0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d9c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d9d0: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d9e0: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d9f0: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
da00: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
da10: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
da20: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
da30: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
da40: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
da50: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
da60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
da70: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
da80: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
da90: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
daa0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
dab0: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
dac0: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
dad0: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
dae0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
daf0: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
db00: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
db10: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
db20: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
db30: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
db60: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
db70: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
db80: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
db90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dba0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
dbb0: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
dbc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
dbd0: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
dbe0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
dbf0: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
dc00: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dc10: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dc20: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dc30: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dc40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc50: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dc60: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dc70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dc80: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dc90: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dca0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dcb0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dcc0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dcd0: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dce0: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dcf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd00: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dd10: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dd20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dd30: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dd40: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dd50: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dd60: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dd70: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dd80: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dd90: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dda0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
ddb0: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
ddc0: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
ddd0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dde0: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
ddf0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
de00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
de10: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
de20: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
de30: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
de40: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
de50: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
de60: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
de70: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
de80: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
de90: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
dea0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
deb0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
dec0: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
ded0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dee0: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
def0: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
df00: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
df10: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
df20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
df30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
df40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
df50: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
df60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
df70: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
df80: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
df90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dfa0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
dfb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
dfc0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
dfd0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
dfe0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
dff0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
e000: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
e010: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
e020: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e030: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
e040: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
e050: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
e060: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
e070: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e080: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
e090: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
e0a0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e0b0: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e0c0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e0d0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e0e0: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e0f0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e100: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e110: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e120: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e130: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e140: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e150: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e160: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e170: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e180: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e190: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e1a0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e1b0: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e1c0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e1d0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e1e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e1f0: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e200: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e210: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e220: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e230: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e270: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e280: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e290: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e2a0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e2b0: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e2c0: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e2d0: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e2e0: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e2f0: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e300: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e310: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e340: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e350: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e360: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e390: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e3a0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e3b0: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e3c0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e3d0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e3e0: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e3f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e400: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e410: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e420: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e430: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e440: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e450: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e460: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e470: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e480: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e490: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e4a0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e4b0: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e4c0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e4d0: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e4e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e4f0: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e500: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e510: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e520: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e530: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e540: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e550: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e560: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e570: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e590: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e5a0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e5b0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e5c0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e5d0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e5e0: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e5f0: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e600: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e610: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e620: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e630: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e640: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e650: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e660: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e670: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e680: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e6a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e6b0: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e6c0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e6d0: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e6e0: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e6f0: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e700: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e710: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e720: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e730: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e740: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e750: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e760: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e770: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e780: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e790: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e7a0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e7b0: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e7c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e7d0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e7e0: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e7f0: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e800: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e810: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e820: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e830: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e840: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e850: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e860: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e870: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e880: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e890: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e8a0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e8b0: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e8c0: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e8d0: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e8e0: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e8f0: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e900: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e910: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e920: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e930: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e940: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e950: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e960: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e970: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e980: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e990: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e9a0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e9b0: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e9c0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e9d0: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e9e0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e9f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
ea00: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
ea10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ea20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ea30: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
ea40: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
ea50: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
ea60: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
ea70: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
ea80: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
ea90: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
eaa0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
eab0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eac0: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
ead0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
eae0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
eaf0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
eb00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
eb10: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
eb20: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
eb30: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
eb40: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eb50: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
eb60: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
eb70: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
eb80: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
eb90: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
eba0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ebb0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ebc0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ebd0: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ebe0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ebf0: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
ec00: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
ec10: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
ec20: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ec30: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
ec40: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
ec50: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ec60: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ec70: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ec80: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ec90: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eca0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ecb0: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ecc0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ecd0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ece0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ecf0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ed00: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ed10: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ed20: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ed30: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ed40: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
ed50: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ed60: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ed70: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ed80: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ed90: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
eda0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
edb0: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
edc0: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
edd0: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ede0: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
edf0: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ee00: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ee10: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ee20: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ee30: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ee40: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
ee50: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
ee60: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
ee70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
ee80: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ee90: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
eea0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
eeb0: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
eec0: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
eed0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
eee0: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
eef0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ef00: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ef10: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ef20: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ef30: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ef40: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
ef50: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
ef60: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
ef70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ef80: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
ef90: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
efa0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
efb0: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
efc0: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
efd0: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
efe0: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
eff0: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
f000: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
f010: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
f020: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
f030: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
f040: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
f050: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f060: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
f070: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
f080: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
f090: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f0a0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f0b0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f0c0: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f0d0: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f0e0: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f0f0: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f100: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f110: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f120: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f130: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f140: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f150: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f160: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f170: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f180: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f190: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f1a0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f1b0: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f1c0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f1d0: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f1e0: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f1f0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f200: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f210: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f220: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f230: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f240: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f250: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f260: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f270: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f280: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f290: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f2a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f2b0: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f2c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f2d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f2e0: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f300: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f310: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f320: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f330: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f340: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f350: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f360: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f370: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f390: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f3a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f3b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f3c0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f3d0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f3e0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f3f0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f400: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f410: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f420: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f430: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f440: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f450: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f460: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f470: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f480: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f490: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f4a0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f4b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f4c0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f4d0: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f4e0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f4f0: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f500: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f510: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f520: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f530: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f540: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f550: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f560: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f570: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f580: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f590: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f5a0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f5b0: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f5c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f5d0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f5e0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f5f0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f600: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f610: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f620: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f630: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f640: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f650: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f660: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f670: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f680: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f690: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f6a0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f6b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f6c0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f6d0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f6e0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f6f0: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f700: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f710: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f720: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f730: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f740: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f750: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f760: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f770: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f780: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f790: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f7a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f7b0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f7c0: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f7d0: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f7f0: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f800: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f810: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f820: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f850: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f860: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f870: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f880: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f890: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f8a0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f8b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f8c0: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f8d0: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f8e0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f8f0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f900: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f910: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f920: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f930: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f940: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f950: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f960: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f970: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f980: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f990: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f9a0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f9b0: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f9c0: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f9d0: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f9e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f9f0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
fa00: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
fa10: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
fa20: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
fa30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
fa40: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
fa50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fa60: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
fa70: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
fa80: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
fa90: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
faa0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fab0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fac0: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fad0: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fae0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
faf0: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fb00: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fb10: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fb20: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fb30: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fb40: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
fb50: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fb60: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fb70: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fb80: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fb90: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fba0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fbb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fbc0: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fbd0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fbe0: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fbf0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fc00: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fc10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fc20: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fc30: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fc40: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fc50: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fc60: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fc70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fc80: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fc90: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fca0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fcb0: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fcc0: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fcd0: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fce0: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fcf0: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fd00: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fd10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fd20: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fd30: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fd40: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fd50: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fd60: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fd70: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fd80: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fd90: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fda0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fdb0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fdc0: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fdd0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fde0: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fdf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fe00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fe20: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fe30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fe40: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fe50: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fe60: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fe70: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fe80: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fe90: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fea0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
feb0: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fed0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fee0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fef0: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
ff00: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
ff10: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
ff20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ff30: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
ff40: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ff50: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ff60: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ff70: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
ff80: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
ff90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ffa0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ffb0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ffc0: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
ffd0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
ffe0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
fff0: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
10000 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
10010 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
10020 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
10030 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
10040 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
10050 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
10060 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
10070 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
10080 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
10090 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
100a0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
100b0 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
100c0 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
100d0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
100e0 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
100f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10100 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10110 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10120 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10130 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10140 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
10150 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10160 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10170 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10180 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10190 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
101a0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
101b0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
101c0 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
101d0 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
101e0 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
101f0 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10200 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10210 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10220 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10230 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10240 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
10250 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10260 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10270 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10280 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10290 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
102a0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
102b0 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
102c0 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
102d0 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
102e0 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
102f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10300 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10310 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10320 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10330 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10340 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
10350 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10360 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10370 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10380 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10390 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
103a0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
103b0 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
103c0 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
103d0 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
103e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
103f0 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10400 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10410 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10420 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10430 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10440 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
10450 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10460 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10470 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10480 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10490 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
104a0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
104b0 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
104c0 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
104d0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
104e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
104f0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10500 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10510 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10530 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10540 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
10550 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10560 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10570 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10580 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10590 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
105a0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
105b0 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
105c0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
105d0 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
105e0 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
105f0 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10600 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10610 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10620 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10630 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10640 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
10650 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10660 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10670 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10680 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10690 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
106a0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
106b0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
106c0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
106d0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
106e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
106f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10700 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10710 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10720 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10730 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10740 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
10750 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
10760 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
10770 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
10780 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
10790 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
107a0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
107b0 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
107c0 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
107d0 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
107e0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
107f0 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10800 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10810 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10820 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10830 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10840 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
10850 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
10860 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
10870 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
10880 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10890 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
108a0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
108b0 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
108c0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
108d0 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
108e0 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
108f0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10900 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10910 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10920 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10930 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10940 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
10950 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
10960 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
10970 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
10980 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
10990 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
109a0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
109b0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
109c0 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
109d0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
109e0 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
109f0 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10a00 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10a10 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10a20 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10a30 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10a40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
10a50 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10a60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10a70 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10a80 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10aa0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10ab0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10ac0 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10ae0 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10af0 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10b00 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b20 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10b30 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10b40 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10b50 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10b60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10b70 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10b80 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10b90 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10bb0 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10bc0 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10bd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10be0 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10c00 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10c10 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10c20 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10c30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10c40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10c50 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10c60 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10c70 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c90 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10ca0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10cb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10cc0 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10cd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10ce0 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10cf0 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10d00 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10d10 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10d20 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10d30 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10d40 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10d50 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10d60 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10d70 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10d80 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10d90 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10da0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10db0 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10dc0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10dd0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10de0 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10df0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10e00 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10e10 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10e20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10e30 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10e40 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10e50 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10e60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10e70 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10e80 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10e90 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10ea0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10eb0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10ec0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10ed0 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10ee0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10ef0 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10f00 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10f10 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10f20 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10f30 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10f40 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10f50 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10f60 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10f70 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10f80 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10f90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10fa0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10fb0 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10fc0 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10fd0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10fe0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10ff0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11000 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
11010 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
11020 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11030 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
11040 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
11050 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
11060 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11070 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11080 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
11090 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
110a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
110d0 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
110e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
110f0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11100 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11110 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11120 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11130 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11140 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
11150 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
11160 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
11170 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
11180 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
11190 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
111a0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
111b0 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
111c0 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
111d0 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
111e0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
111f0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11200 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11210 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11220 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11230 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11240 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
11250 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
11260 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
11270 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
11280 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
11290 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
112a0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
112b0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
112c0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
112d0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
112e0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
112f0 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11300 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11310 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11320 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11330 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11340 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
11350 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11360 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
11370 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
11380 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
113a0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
113b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
113c0 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
113d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
113e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
113f0 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11400 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11410 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11420 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11430 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11440 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11450 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11460 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11470 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11480 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11490 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
114a0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
114b0 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
114c0 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
114d0 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
114e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
114f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11500 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11510 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11520 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11540 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11550 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11560 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11570 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11580 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11590 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
115a0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
115b0 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
115c0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
115d0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
115e0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
115f0 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11600 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11610 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11620 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11630 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11640 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11650 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11660 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11670 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11680 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11690 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
116a0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
116b0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
116c0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
116d0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
116e0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
116f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11700 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11710 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11720 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11730 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11740 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11750 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11760 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11770 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11780 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11790 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
117a0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
117b0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
117c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
117d0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
117e0 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
117f0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11800 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11810 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11820 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11830 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11840 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11850 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11860 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11870 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11880 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11890 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
118a0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
118b0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
118c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
118d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
118e0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
118f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11900 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11910 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11920 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11930 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11940 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11950 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11960 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11970 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11980 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11990 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
119a0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
119b0 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
119c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
119d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
119e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
119f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11a00 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11a10 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11a20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11a30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11a40 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  OMIT_CONCURRENT.
11a50 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61 72  /*.** If they ar
11a60 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 2c 20 62  e not already, b
11a70 65 67 69 6e 20 72 65 63 6f 72 64 69 6e 67 20 61  egin recording a
11a80 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
11a90 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
11aa0 65 72 0a 2a 2a 20 62 79 20 74 68 65 20 62 2d 74  er.** by the b-t
11ab0 72 65 65 20 6c 61 79 65 72 20 54 68 69 73 20 69  ree layer This i
11ac0 73 20 75 73 65 64 20 62 79 20 63 6f 6e 63 75 72  s used by concur
11ad0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
11ae0 73 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  s. Return.** SQL
11af0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11b00 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
11b10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 53  te error code (S
11b20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20  QLITE_NOMEM) if 
11b30 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
11b40 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
11b50 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63  e3PagerBeginConc
11b60 75 72 72 65 6e 74 28 50 61 67 65 72 20 2a 70 50  urrent(Pager *pP
11b70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
11b80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11b90 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  f( pPager->pAllR
11ba0 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ead==0 ){.    pP
11bb0 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d  ager->pAllRead =
11bc0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
11bd0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
11be0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
11bf0 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d  ager->pAllRead==
11c00 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
11c10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11c20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11c30 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69   rc;.}../* !defi
11c40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11c50 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a  CONCURRENT).**.*
11c60 2a 20 53 74 6f 70 20 72 65 63 6f 72 64 69 6e 67  * Stop recording
11c70 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20   all pages read 
11c80 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
11c90 61 79 65 72 20 62 79 20 74 68 65 20 62 2d 74 72  ayer by the b-tr
11ca0 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61 6e 64 20  ee layer.** and 
11cb0 64 69 73 63 61 72 64 20 61 6e 79 20 63 75 72 72  discard any curr
11cc0 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a  ent records..*/.
11cd0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
11ce0 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 50  rEndConcurrent(P
11cf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11d00 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
11d10 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
11d20 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50 61 67 65  llRead);.  pPage
11d30 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20 30 3b  r->pAllRead = 0;
11d40 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
11d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
11d60 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 52 65  URRENT).**.** Re
11d70 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
11d80 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
11d90 77 61 6c 20 6d 6f 64 65 2e 20 46 61 6c 73 65 20  wal mode. False 
11da0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
11db0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
11dc0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
11dd0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
11de0 67 65 72 2d 3e 70 57 61 6c 21 3d 30 3b 0a 7d 0a  ger->pWal!=0;.}.
11df0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11e00 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
11e10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20   */../*.** Free 
11e20 74 68 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  the Pager.pInJou
11e30 72 6e 61 6c 20 61 6e 64 20 50 61 67 65 72 2e 70  rnal and Pager.p
11e40 41 6c 6c 52 65 61 64 20 62 69 74 76 65 63 20 6f  AllRead bitvec o
11e50 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
11e60 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65  c void pagerFree
11e70 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11e80 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
11e90 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11ea0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
11eb0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
11ec0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
11ed0 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e 64 43  sqlite3PagerEndC
11ee0 6f 6e 63 75 72 72 65 6e 74 28 70 50 61 67 65 72  oncurrent(pPager
11ef0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
11f00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11f10 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11f20 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11f30 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11f40 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11f50 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11f60 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11f70 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11f80 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11f90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11fa0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11fb0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
11fc0 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
11fd0 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
11fe0 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
11ff0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
12000 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
12010 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
12020 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
12030 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
12040 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
12050 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
12060 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
12070 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
12080 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
12090 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
120a0 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
120b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
120c0 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
120d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
120e0 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
120f0 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
12100 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
12110 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
12120 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
12130 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
12140 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
12150 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
12160 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
12170 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
12180 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
12190 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
121a0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
121b0 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
121c0 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
121d0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
121e0 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
121f0 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
12200 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
12210 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
12220 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
12230 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
12240 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
12250 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12260 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
12270 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
12280 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
12290 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
122a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
122b0 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
122c0 70 61 67 65 72 46 72 65 65 42 69 74 76 65 63 73  pagerFreeBitvecs
122d0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 6c 65  (pPager);.  rele
122e0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
122f0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
12300 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
12310 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
12320 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
12330 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
12340 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
12350 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
12360 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
12370 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12380 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12390 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
123a0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
123b0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
123e0 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
123f0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
12400 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
12410 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12420 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
12430 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
12440 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
12450 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
12460 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
12470 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
12480 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
12490 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
124a0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
124b0 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
124c0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
124d0 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
124e0 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
124f0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
12500 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
12510 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
12520 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
12530 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
12540 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
12550 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12560 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
12570 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12580 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12590 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
125a0 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
125b0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
125c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
125d0 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
125e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
125f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12600 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
12610 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12620 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12630 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
12640 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
12650 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12660 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
12670 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12680 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12690 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
126a0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
126b0 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
126c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
126d0 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
126e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
126f0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12710 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12720 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12730 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
12740 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12750 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12760 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
12770 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
12780 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12790 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
127a0 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
127b0 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
127c0 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
127d0 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
127e0 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
127f0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
12800 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
12810 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12820 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
12830 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12840 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
12850 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12860 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
12870 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
12880 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12890 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
128a0 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
128b0 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
128c0 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
128d0 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
128e0 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
128f0 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
12900 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
12910 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
12920 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
12930 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
12940 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
12950 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
12960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12970 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
12980 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12990 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
129a0 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
129b0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
129c0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
129d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
129e0 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
129f0 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12a00 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12a10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12a20 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
12a30 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
12a40 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
12a50 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
12a60 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12a70 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
12a80 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12a90 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12aa0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12ab0 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12ac0 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12ad0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12ae0 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12af0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12b00 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12b10 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
12b20 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
12b30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
12b40 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
12b50 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
12b60 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
12b70 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12b80 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12b90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12bb0 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12bc0 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12bd0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12be0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
12bf0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12c00 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12c10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12c20 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
12c30 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
12c40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12c50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12c60 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12c70 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12c80 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12c90 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12ca0 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12cb0 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12cc0 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12cd0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12ce0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12cf0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12d00 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12d10 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
12d20 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12d30 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12d40 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12d50 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12d60 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12d70 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12d80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12d90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12da0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12db0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12dc0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12dd0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12de0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12df0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12e00 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12e10 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12e20 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12e30 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12e40 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12e50 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12e60 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12e70 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12e80 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12e90 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12ea0 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12eb0 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12ec0 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12ed0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12ee0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12ef0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12f00 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12f10 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12f20 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12f30 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12f40 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12f50 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12f60 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12f70 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12f80 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12f90 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12fa0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12fb0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12fc0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12fd0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12fe0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12ff0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
13000 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13010 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13020 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
13030 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
13040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13050 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
13060 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
13070 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
13080 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
13090 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
130a0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
130b0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
130c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
130d0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
130e0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
130f0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
13100 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
13110 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
13120 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
13130 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
13140 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
13150 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
13160 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
13170 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
13180 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
13190 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
131a0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
131b0 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
131c0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
131d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
131e0 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
131f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13200 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
13210 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
13220 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
13230 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
13240 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
13250 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
13260 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
13270 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
13280 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
13290 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
132a0 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
132b0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
132c0 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
132d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
132e0 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
132f0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13300 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13310 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13320 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
13330 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
13340 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
13350 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
13360 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
13370 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
13380 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
13390 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
133a0 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
133b0 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
133c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
133d0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
133e0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
133f0 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13400 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13410 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13420 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13430 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
13440 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
13450 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
13460 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
13470 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
13480 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13490 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
134a0 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
134b0 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
134c0 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
134d0 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
134e0 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
134f0 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
13500 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13510 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
13520 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
13530 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
13540 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
13550 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
13560 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
13570 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
13580 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13590 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
135a0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
135b0 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
135c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
135d0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
135e0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
135f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13600 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
13610 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
13620 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
13630 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
13640 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13650 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
13660 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
13670 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
13680 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13690 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
136a0 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
136b0 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
136c0 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
136d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
136e0 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
136f0 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13700 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13710 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13720 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
13730 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
13740 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13750 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13760 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13770 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
13780 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13790 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
137a0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
137b0 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
137c0 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
137d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
137e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
137f0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13800 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13810 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13820 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
13830 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
13840 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13850 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13860 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13870 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
13880 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13890 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
138a0 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
138b0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
138c0 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
138d0 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
138e0 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
138f0 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13900 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13910 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13920 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
13930 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
13940 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13950 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13960 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13970 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13980 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13990 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
139a0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
139b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
139c0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
139d0 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
139e0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
139f0 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13a00 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13a10 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13a20 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
13a30 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
13a40 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13a50 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13a60 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13a70 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
13a80 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13a90 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13aa0 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13ab0 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13ac0 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13ad0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13ae0 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13af0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13b00 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13b10 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13b20 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
13b30 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
13b40 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13b50 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13b60 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13b70 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
13b80 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13b90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13ba0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13bb0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13bc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13bd0 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13be0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13c00 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13c10 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13c20 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
13c30 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
13c40 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13c50 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13c60 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13c70 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13c80 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13c90 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13ca0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13cb0 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13cc0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13cd0 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13ce0 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
13cf0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
13d00 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
13d10 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
13d20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13d30 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
13d40 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13d50 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13d60 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13d70 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13d80 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13d90 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13da0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13db0 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13dc0 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13dd0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13de0 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
13df0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
13e00 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
13e10 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
13e20 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
13e30 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
13e40 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13e50 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13e60 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13e70 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13e80 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13e90 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13ea0 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13eb0 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13ec0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13ed0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13ee0 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
13ef0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13f00 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
13f10 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
13f20 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
13f30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13f40 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13f50 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13f60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13f70 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13f80 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13f90 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13fa0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13fb0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13fc0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13fe0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13ff0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
14000 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
14010 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
14020 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
14030 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
14040 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
14050 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
14060 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
14070 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14080 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
14090 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
140a0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
140b0 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
140c0 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
140d0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
140e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
140f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14100 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
14110 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71  MORY );.      sq
14120 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
14130 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
14140 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
14150 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14160 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14170 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
14180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
14190 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
141a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
141b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
141c0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
141d0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
141e0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
141f0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
14200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14210 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
14220 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
14230 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14240 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73  new file size is
14250 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
14260 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77  e inode right aw
14270 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ay..          **
14280 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a   Otherwise the j
14290 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73  ournal might res
142a0 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67  urrect following
142b0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e   a power loss an
142c0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
142d0 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72  ause the last tr
142e0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c  ansaction to rol
142f0 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20  l back.  See.   
14300 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a         ** https:
14310 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c  //bugzilla.mozil
14320 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e  la.org/show_bug.
14330 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20  cgi?id=1072773. 
14340 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
14350 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14360 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
14370 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
14380 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
14390 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
143a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
143b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
143c0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
143d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
143e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
143f0 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
14400 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
14410 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
14420 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
14430 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14440 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
14450 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
14460 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
14470 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
14480 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14490 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
144a0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
144b0 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
144c0 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
144d0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
144e0 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
144f0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
14500 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
14510 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
14520 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
14530 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
14540 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
14550 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
14560 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14570 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
14580 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14590 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
145a0 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
145b0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
145c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
145d0 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21  int bDelete = (!
145e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
145f0 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   && sqlite3Journ
14600 61 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  alExists(pPager-
14610 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73  >jfd));.      as
14620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
14630 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14640 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
14650 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
14660 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14670 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14680 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14690 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
146a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
146b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
146c0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
146d0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
146e0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
146f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
14700 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
14710 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14720 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14730 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
14740 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
14750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14760 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
14770 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
14780 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
14790 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
147a0 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
147b0 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
147c0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
147d0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
147e0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
147f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
14800 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
14810 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
14820 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
14830 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
14840 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
14850 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
14860 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
14870 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
14880 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 61 67   }.#endif..  pag
14890 65 72 46 72 65 65 42 69 74 76 65 63 73 28 70 50  erFreeBitvecs(pP
148a0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
148b0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
148c0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
148d0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
148e0 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
148f0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
14900 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
14910 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
14920 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
14930 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
14940 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
14950 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
14960 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
14970 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
14980 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
14990 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
149a0 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
149b0 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
149c0 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
149d0 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
149e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
149f0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
14a00 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
14a10 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
14a20 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
14a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
14a40 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
14a50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
14a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
14a70 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
14a80 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
14a90 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14aa0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14ab0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14ac0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14ad0 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14ae0 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
14af0 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
14b00 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
14b10 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
14b20 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
14b30 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
14b40 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
14b50 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
14b60 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
14b70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14b80 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
14b90 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
14ba0 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14bb0 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14bc0 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14bd0 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14be0 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
14bf0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
14c00 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
14c10 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
14c20 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
14c30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14c40 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
14c50 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
14c60 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
14c70 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
14c80 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
14c90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14ca0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14cb0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
14cc0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
14cd0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
14ce0 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
14cf0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
14d00 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
14d10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
14d20 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
14d30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
14d40 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
14d50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14d60 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
14d70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14d80 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
14d90 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
14da0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14db0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14dc0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14dd0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14de0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
14df0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14e00 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14e10 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14e20 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14e30 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14e40 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14e50 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14e60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14e70 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14e80 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14e90 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
14ea0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14eb0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14ec0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14ed0 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14ee0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14ef0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14f00 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14f10 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14f20 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14f30 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14f40 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14f50 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14f60 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14f70 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14f80 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14f90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14fa0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
14fb0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14fc0 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14fd0 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14fe0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
14ff0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
15000 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
15010 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
15020 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
15030 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
15040 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
15050 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
15060 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
15070 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
15080 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
15090 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
150a0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
150b0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
150c0 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
150d0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
150e0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
150f0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
15100 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
15110 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
15120 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
15130 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
15140 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
15150 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
15160 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
15170 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
15180 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
15190 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
151a0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
151b0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
151c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
151d0 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
151e0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
151f0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
15200 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
15210 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
15220 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
15230 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15240 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
15250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
15260 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
15270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15280 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
15290 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
152a0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
152b0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
152c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
152d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
152e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
152f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
15300 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
15310 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
15320 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
15330 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
15340 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
15350 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
15360 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
15370 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
15380 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
15390 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
153a0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
153b0 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
153c0 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
153d0 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
153e0 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
153f0 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
15400 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15410 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
15420 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
15430 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
15440 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
15450 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
15460 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
15470 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
15480 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
15490 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
154a0 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
154b0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
154c0 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
154d0 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
154e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
154f0 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
15500 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
15510 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
15520 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
15530 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
15540 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
15550 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
15560 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
15570 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
15580 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
15590 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
155a0 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
155b0 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
155c0 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
155d0 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
155e0 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
155f0 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
15600 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
15610 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
15620 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
15630 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
15640 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
15650 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
15660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
15670 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
15680 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
15690 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
156a0 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
156b0 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
156c0 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
156d0 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
156e0 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
156f0 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
15700 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
15710 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
15720 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
15730 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
15740 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
15750 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
15760 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
15770 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
15780 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
15790 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
157a0 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
157b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
157c0 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
157d0 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
157e0 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
157f0 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
15800 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
15810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
15820 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
15830 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
15840 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
15850 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
15860 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
15870 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15880 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
15890 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
158a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
158b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
158c0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
158d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
158e0 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
158f0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
15900 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
15930 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
15940 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
15950 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
15960 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
15970 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
15980 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
15990 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  ec */.#endif..#i
159a0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
159b0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  CODEC./*.** Make
159c0 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72   sure the number
159d0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74   of reserved bit
159e0 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e  s is the same in
159f0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
15a00 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20  .** pager as it 
15a10 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  is in the source
15a20 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70  .  This comes up
15a30 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63   when a VACUUM c
15a40 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75  hanges the.** nu
15a50 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15a60 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70   bits to the "op
15a70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a  timal" amount..*
15a80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
15a90 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28  gerAlignReserve(
15aa0 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61  Pager *pDest, Pa
15ab0 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66  ger *pSrc){.  if
15ac0 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76  ( pDest->nReserv
15ad0 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76  e!=pSrc->nReserv
15ae0 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  e ){.    pDest->
15af0 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d  nReserve = pSrc-
15b00 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  >nReserve;.    p
15b10 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
15b20 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Dest);.  }.}.#en
15b30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
15b40 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
15b50 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
15b60 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
15b70 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
15b80 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
15b90 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
15ba0 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
15bb0 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
15bc0 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
15bd0 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
15be0 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
15bf0 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
15c00 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
15c10 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
15c20 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
15c30 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
15c40 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
15c50 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
15c60 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
15c70 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
15c80 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
15c90 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
15ca0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15cb0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
15cc0 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
15cd0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
15cf0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
15d00 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15d10 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
15d20 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
15d30 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
15d40 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
15d50 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
15d60 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
15d70 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
15d80 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
15d90 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
15da0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
15db0 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
15dc0 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
15dd0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
15de0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
15df0 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
15e00 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
15e10 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
15e20 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
15e30 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
15e40 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
15e50 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
15e60 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
15e70 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
15e80 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
15e90 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15ea0 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
15eb0 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
15ec0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15ed0 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
15ee0 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
15ef0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15f00 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
15f10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
15f20 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
15f30 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
15f40 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15f50 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
15f60 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
15f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
15f80 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
15f90 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15fa0 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
15fb0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
15fc0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15fd0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
15fe0 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
15ff0 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
16000 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
16010 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
16020 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
16030 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
16040 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
16050 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
16060 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
16070 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
16080 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
16090 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
160a0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
160b0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
160c0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
160d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
160e0 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
160f0 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
16100 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
16110 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
16120 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
16130 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
16140 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
16150 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
16160 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
16170 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
16180 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
16190 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
161a0 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
161b0 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
161c0 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
161d0 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
161e0 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
161f0 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
16200 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
16210 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
16220 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16230 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
16240 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
16250 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
16260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16270 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
16280 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
16290 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162b0 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
162c0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
162d0 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
16300 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
16310 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
16320 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
16330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
16340 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
16350 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
16360 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
16370 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
16380 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
16390 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
163a0 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
163b0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
163c0 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
163d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
163e0 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
163f0 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
16400 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
16410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16420 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16430 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
16440 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
16450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16460 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
16470 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
16480 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
16490 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164b0 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
164c0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
164d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
164e0 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
164f0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
16500 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
16510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
16520 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
16550 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
16560 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
16570 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
16580 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
16590 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
165a0 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
165b0 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
165c0 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
165d0 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
165e0 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
165f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
16600 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
16610 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
16620 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
16630 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
16640 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
16650 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
16660 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
16670 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
16680 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
16690 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
166a0 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
166b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
166c0 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
166d0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
166e0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
166f0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
16700 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
16710 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
16720 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
16730 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
16740 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
16750 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
16760 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
16770 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
16780 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
16790 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
167a0 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
167b0 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
167c0 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
167d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
167e0 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
167f0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16800 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
16810 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
16820 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
16830 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
16840 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
16850 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
16860 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
16870 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
16880 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
16890 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
168a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
168b0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
168c0 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
168d0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
168e0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
168f0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
16900 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
16910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
16920 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
16930 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16940 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
16950 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
16960 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
16970 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
16980 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
16990 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
169a0 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
169b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
169c0 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
169d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
169e0 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
169f0 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
16a00 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
16a10 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
16a20 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
16a30 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
16a40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16a50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16a60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16a70 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
16a80 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16a90 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
16aa0 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
16ab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
16ad0 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
16ae0 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
16af0 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
16b00 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
16b10 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
16b20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
16b30 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
16b40 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
16b50 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
16b60 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
16b70 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
16b80 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
16b90 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
16ba0 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
16bb0 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
16bc0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
16bd0 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
16be0 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
16bf0 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
16c00 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
16c10 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
16c20 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
16c30 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
16c40 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
16c50 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
16c60 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
16c70 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
16c80 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16c90 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
16ca0 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
16cb0 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
16cc0 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
16cd0 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
16ce0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16cf0 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
16d00 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
16d10 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
16d20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
16d30 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
16d40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
16d50 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
16d60 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
16d70 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
16d80 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
16d90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16da0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
16db0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
16dc0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
16dd0 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
16de0 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  ck before during
16df0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
16e00 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
16e10 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
16e20 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
16e30 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
16e40 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
16e50 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
16e60 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
16e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16e80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
16e90 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
16ea0 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
16eb0 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
16ec0 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
16ed0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
16ee0 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
16ef0 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
16f00 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
16f10 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
16f20 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
16f30 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
16f40 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
16f50 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
16f60 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
16f70 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
16f80 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
16f90 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
16fa0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
16fb0 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
16fc0 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
16fd0 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
16fe0 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
16ff0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17000 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
17010 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
17020 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
17030 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
17040 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
17050 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
17060 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
17070 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
17080 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
17090 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
170a0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
170b0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
170c0 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
170d0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
170e0 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
170f0 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
17100 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
17110 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
17120 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
17130 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
17140 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
17150 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
17160 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
17170 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
17180 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
17190 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
171a0 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
171b0 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
171c0 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
171d0 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
171e0 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
171f0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
17200 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
17210 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
17220 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
17230 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
17240 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
17250 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
17260 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
17270 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
17280 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
17290 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
172a0 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
172b0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
172c0 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
172d0 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
172e0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
172f0 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
17300 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
17310 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
17320 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
17330 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
17340 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
17350 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
17360 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
17370 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
17380 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17390 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
173a0 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
173b0 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
173c0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
173d0 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
173e0 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
173f0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
17400 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
17410 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
17420 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
17430 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
17440 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
17450 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
17460 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
17470 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
17480 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
17490 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
174a0 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
174b0 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
174c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
174d0 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
174e0 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
174f0 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
17500 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
17510 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
17520 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
17530 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
17540 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
17550 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
17560 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
17570 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
17580 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
17590 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
175a0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
175b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
175c0 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
175d0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
175e0 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
175f0 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
17600 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
17610 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
17620 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
17630 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
17640 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
17650 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
17660 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
17670 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
17680 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
17690 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
176a0 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
176b0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
176c0 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
176d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
176e0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
176f0 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
17700 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
17710 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
17720 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
17730 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
17740 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
17750 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
17760 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
17770 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
17780 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
17790 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
177a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
177b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
177c0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
177d0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  no);.  }.  asser
177e0 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42  t( pPg || !MEMDB
177f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17800 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
17810 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d  GER_OPEN || pPg=
17820 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
17830 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
17840 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
17850 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
17860 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
17870 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
17880 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
17890 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
178a0 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20  8*)aData),.     
178b0 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e        (isMainJrn
178c0 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22  l?"main-journal"
178d0 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a  :"sub-journal").
178e0 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61    ));.  if( isMa
178f0 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73  inJrnl ){.    is
17900 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
17910 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66  >noSync || (*pOf
17920 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e  fset <= pPager->
17930 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
17940 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63  else{.    isSync
17950 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20  ed = (pPg==0 || 
17960 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  0==(pPg->flags &
17970 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
17980 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  ));.  }.  if( is
17990 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
179a0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
179b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
179c0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
179d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
179e0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20  GER_OPEN).   && 
179f0 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20  isSynced.  ){.  
17a00 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67    i64 ofst = (pg
17a10 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
17a20 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
17a30 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61   testcase( !isSa
17a40 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20  vepnt && pPg!=0 
17a50 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  && (pPg->flags&P
17a60 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
17a70 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17a80 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
17a90 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63  Pager) );.    rc
17aa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
17ab0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
17ac0 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
17ad0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
17ae0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
17af0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
17b00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
17b10 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
17b20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
17b30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
17b40 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
17b50 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
17b60 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
17b70 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
17b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
17b90 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
17ba0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
17bb0 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
17bc0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
17bd0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
17be0 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
17bf0 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
17c00 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
17c10 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
17c20 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
17c30 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
17c40 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
17c50 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
17c60 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
17c70 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
17c80 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
17c90 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
17ca0 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
17cb0 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
17cc0 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
17cd0 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
17ce0 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
17cf0 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
17d00 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
17d10 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
17d20 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
17d30 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
17d40 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
17d50 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
17d60 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
17d70 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
17d80 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
17d90 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
17da0 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
17db0 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
17dc0 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
17dd0 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
17de0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
17df0 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17e00 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
17e10 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
17e20 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17e30 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
17e40 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
17e50 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
17e60 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17e70 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
17e80 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
17e90 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
17ea0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
17eb0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
17ec0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
17ed0 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
17ee0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17ef0 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
17f00 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
17f10 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
17f20 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
17f30 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
17f40 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
17f50 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
17f60 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
17f70 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
17f80 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
17f90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
17fa0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
17fb0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
17fc0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
17fd0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
17fe0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
17ff0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
18000 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18010 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ACK;.    rc = sq
18020 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
18030 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
18040 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
18050 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
18060 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
18070 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
18080 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
18090 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
180a0 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
180b0 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
180c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
180d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d  urn rc;.    pPg-
180e0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
180f0 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
18100 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18110 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
18120 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
18130 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
18140 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
18150 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
18160 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
18170 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
18180 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
18190 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
181a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
181b0 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
181c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
181d0 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
181e0 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
181f0 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
18200 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
18210 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
18220 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
18230 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
18240 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
18250 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
18260 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
18270 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
18280 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
18290 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
182a0 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
182b0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
182c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
182d0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
182e0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69  (pPg);.    if( i
182f0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
18300 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
18310 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
18320 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
18330 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
18340 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
18350 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
18360 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
18370 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
18380 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
18390 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
183a0 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
183b0 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
183c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
183d0 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
183e0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
183f0 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
18400 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
18410 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
18420 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
18430 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
18440 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  out to the.     
18450 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
18460 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
18470 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
18480 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  eption to this r
18490 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ule. If the page
184a0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
184b0 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61  .      ** back a
184c0 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65  s part of a save
184d0 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d  point (or statem
184e0 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72  ent) rollback fr
184f0 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  om an .      ** 
18500 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
18510 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
18520 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
18530 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20  it is not safe. 
18540 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20       ** to mark 
18550 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
18560 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  n. This is becau
18570 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70  se marking the p
18580 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  age as.      ** 
18590 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72  clean will clear
185a0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
185b0 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65  SYNC flag. Since
185c0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20   the page is.   
185d0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e     ** already in
185e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
185f0 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50  e (recorded in P
18600 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ager.pInJournal)
18610 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
18620 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18630 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65  C flag is cleare
18640 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  d, if the page i
18650 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
18660 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
18670 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
18680 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
18690 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
186a0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  but.      ** the
186b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
186c0 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62   flag will not b
186d0 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20  e set. It could 
186e0 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79  then potentially
186f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69  .      ** be wri
18700 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68  tten out into th
18710 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18720 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e  before its journ
18730 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  al file.      **
18740 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63   segment is sync
18750 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f  ed. If a crash o
18760 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20  ccurs during or 
18770 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a  following this,.
18780 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
18790 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  e corruption may
187a0 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f   ensue..      */
187b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
187c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
187d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  er) );.      sql
187e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
187f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
18800 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
18810 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
18820 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
18830 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
18840 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
18850 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
18860 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
18870 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
18880 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
18890 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
188a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
188b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
188c0 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
188d0 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
188e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
188f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
18900 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
18910 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
18920 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
18930 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
18940 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
18950 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
18960 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
18970 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
18980 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18990 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
189a0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
189b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
189c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
189d0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
189e0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
189f0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
18a00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18a10 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
18a20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
18a30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
18a40 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
18a50 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
18a60 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18a70 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
18a80 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
18a90 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
18aa0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
18ab0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
18ac0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
18ad0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
18ae0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
18af0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
18b00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
18b10 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
18b20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
18b30 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
18b40 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
18b50 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
18b60 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
18b70 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
18b80 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
18b90 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
18ba0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
18bb0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
18bc0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
18bd0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
18be0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
18bf0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
18c00 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
18c10 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
18c20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
18c30 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
18c40 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
18c50 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
18c60 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
18c70 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
18c80 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
18c90 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
18ca0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
18cb0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
18cc0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
18cd0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
18ce0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
18cf0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
18d00 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
18d10 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
18d20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
18d30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
18d40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
18d50 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
18d60 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
18d70 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
18d80 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
18d90 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
18da0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
18db0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
18dc0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
18dd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18de0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
18df0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
18e00 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18e10 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
18e20 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
18e30 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
18e40 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
18e50 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
18e60 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18e70 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
18e80 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
18e90 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
18ea0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
18eb0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
18ec0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
18ed0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
18ee0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
18ef0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
18f00 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
18f10 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
18f20 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
18f30 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
18f40 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
18f50 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
18f60 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
18f70 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
18f80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18f90 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
18fa0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
18fb0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
18fc0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
18fd0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
18fe0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
18ff0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
19000 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19010 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
19020 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
19030 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
19040 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
19050 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
19060 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
19070 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
19080 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
19090 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
190a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
190b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
190c0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
190d0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
190e0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
190f0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
19100 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
19110 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
19120 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19130 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
19140 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
19150 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
19160 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19170 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
19180 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
191b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
191c0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
191d0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
191e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
191f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
19200 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
19210 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
19220 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
19230 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19240 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
19250 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
19260 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
19270 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19280 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
19290 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
192a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
192b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
192c0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
192d0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
192e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
192f0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
19300 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
19310 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
19320 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
19330 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
19340 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
19350 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19360 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
19370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
19380 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
19390 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
193a0 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
193b0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
193c0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
193d0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
193e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
193f0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
19400 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
19410 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19420 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
19430 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
19440 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
19450 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
19460 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
19470 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
19480 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
19490 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
194a0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
194b0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
194c0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
194d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
194e0 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
194f0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
19500 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
19510 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
19520 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
19530 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
19540 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
19550 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
19560 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
19570 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
19580 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
19590 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
195a0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
195b0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
195c0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
195d0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
195e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
195f0 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
19600 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
19610 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f  ournal.   Also o
19620 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69  btain.  ** suffi
19630 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20  cient space (in 
19640 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68  zMasterPtr) to h
19650 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  old the names of
19660 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75   master.  ** jou
19670 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61  rnal files extra
19680 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61  cted from regula
19690 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  r rollback-journ
196a0 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  als..  */.  rc =
196b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
196c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
196d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
196e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
196f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19700 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65  er_out;.  nMaste
19710 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50  rPtr = pVfs->mxP
19720 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61  athname+1;.  zMa
19730 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
19740 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73  lite3Malloc(nMas
19750 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
19760 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
19770 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
19780 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
19790 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
197a0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
197b0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
197c0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
197d0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
197e0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
197f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
19800 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
19810 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
19820 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
19830 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19840 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
19850 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
19860 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
19870 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
19880 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
19890 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
198a0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
198b0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
198c0 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
198d0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
198e0 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
198f0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
19900 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
19910 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
19920 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
19930 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
19950 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19970 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
19980 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
19990 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
199a0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
199b0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
199c0 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
199d0 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
199e0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
199f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
19a00 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
19a10 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
19a20 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
19a30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
19a40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19a50 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
19a60 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
19a70 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
19a80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
19a90 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
19aa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
19ab0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
19ac0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
19ad0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
19ae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19af0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
19b00 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19b10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
19b20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
19b30 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
19b40 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
19b50 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
19b60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
19b70 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
19b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19b90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
19ba0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19bb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
19bc0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
19bd0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
19be0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
19bf0 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
19c00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
19c10 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
19c20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
19c30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19c40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
19c50 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19c60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
19c70 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
19c80 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
19c90 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
19ca0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
19cb0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
19cc0 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
19cd0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
19ce0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
19cf0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
19d00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
19d10 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
19d20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
19d30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
19d40 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
19d50 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
19d60 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
19d70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
19d80 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
19d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
19da0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19db0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
19dc0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
19dd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
19de0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
19df0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
19e00 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
19e10 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
19e20 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
19e30 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
19e40 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
19e50 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
19e60 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
19e70 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
19e80 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
19e90 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
19ea0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
19eb0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
19ec0 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
19ed0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
19ee0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19ef0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
19f00 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
19f10 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
19f20 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
19f30 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
19f40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
19f50 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
19f60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
19f70 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
19f80 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
19f90 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
19fa0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
19fb0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
19fc0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
19fd0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  Or, it might be 
19fe0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
19ff0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1a000 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
1a010 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
1a020 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
1a030 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
1a040 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
1a050 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
1a060 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
1a070 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
1a080 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
1a090 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
1a0a0 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
1a0b0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
1a0c0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
1a0d0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
1a0e0 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
1a0f0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
1a100 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
1a110 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1a120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
1a130 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1a140 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
1a150 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
1a160 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
1a170 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
1a180 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1a190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1a1a0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
1a1b0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1a1c0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
1a1d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a1e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a1f0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
1a200 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
1a210 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1a220 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
1a230 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
1a240 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
1a250 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1a260 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1a270 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1a280 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1a290 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
1a2a0 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
1a2b0 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
1a2c0 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
1a2d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1a2e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a2f0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
1a300 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
1a310 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
1a320 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
1a330 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
1a340 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
1a350 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1a360 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
1a370 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
1a380 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a  ewSize = szPage*
1a390 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
1a3a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a3b0 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
1a3c0 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
1a3d0 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
1a3e0 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
1a3f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a400 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1a410 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
1a420 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1a430 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
1a440 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
1a450 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1a460 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
1a470 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1a480 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
1a490 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
1a4a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1a4b0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
1a4c0 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
1a4d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a4e0 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
1a4f0 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
1a500 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
1a510 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1a520 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1a530 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
1a540 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
1a550 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a570 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1a580 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
1a590 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
1a5a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a5b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1a5c0 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
1a5d0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1a5e0 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
1a5f0 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
1a600 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1a610 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1a620 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
1a630 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
1a640 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
1a650 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
1a660 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1a670 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
1a680 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
1a690 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
1a6a0 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
1a6b0 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
1a6c0 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
1a6d0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1a6e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
1a6f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
1a700 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
1a710 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
1a720 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
1a730 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
1a740 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1a750 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
1a760 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
1a770 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
1a780 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
1a790 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1a7a0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1a7b0 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
1a7c0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1a7d0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
1a7e0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1a7f0 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
1a800 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1a810 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
1a820 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1a830 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
1a840 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
1a850 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
1a860 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1a870 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
1a880 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
1a890 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a8a0 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
1a8b0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
1a8c0 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
1a8d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1a8e0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1a8f0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
1a900 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1a910 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1a920 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
1a930 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
1a940 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
1a950 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
1a960 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
1a970 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
1a980 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
1a990 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
1a9a0 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
1a9b0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
1a9c0 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
1a9d0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a9e0 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
1a9f0 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
1aa00 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1aa10 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
1aa20 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
1aa30 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
1aa40 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
1aa50 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
1aa60 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
1aa70 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
1aa80 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1aa90 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
1aaa0 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
1aab0 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
1aac0 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
1aad0 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
1aae0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1aaf0 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
1ab00 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
1ab10 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
1ab20 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ab30 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
1ab40 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
1ab50 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
1ab60 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
1ab70 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
1ab80 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1ab90 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
1aba0 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
1abb0 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1abc0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
1abd0 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
1abe0 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
1abf0 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
1ac00 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
1ac10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ac20 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1ac30 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
1ac40 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1ac50 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
1ac60 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1ac70 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1ac80 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
1ac90 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1aca0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1acb0 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
1acc0 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
1acd0 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
1ace0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1acf0 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
1ad00 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
1ad10 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
1ad20 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
1ad30 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
1ad40 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
1ad50 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
1ad60 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
1ad70 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1ad80 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
1ad90 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1ada0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
1adb0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1adc0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r->fd);.  }.}../
1add0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
1ade0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
1adf0 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
1ae00 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
1ae10 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
1ae20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
1ae30 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
1ae40 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
1ae50 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1ae60 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
1ae70 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
1ae80 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
1ae90 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
1aea0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
1aeb0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
1aec0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1aed0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1aee0 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
1aef0 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
1af00 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
1af10 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
1af20 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1af30 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
1af40 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
1af50 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
1af60 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
1af70 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
1af80 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
1af90 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1afa0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
1afb0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
1afc0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
1afd0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
1afe0 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
1aff0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b000 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1b010 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
1b020 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
1b030 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
1b040 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
1b050 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1b060 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1b070 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
1b080 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
1b090 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
1b0a0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
1b0b0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
1b0c0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1b0d0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1b0e0 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
1b0f0 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
1b100 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
1b110 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
1b120 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
1b130 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
1b140 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
1b150 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
1b160 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1b170 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
1b180 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
1b190 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1b1a0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
1b1b0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1b1c0 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
1b1d0 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
1b1e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1b1f0 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
1b200 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
1b210 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
1b220 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
1b230 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
1b240 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
1b250 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
1b260 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
1b270 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
1b280 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
1b290 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1b2a0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
1b2b0 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1b2c0 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
1b2d0 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
1b2e0 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
1b2f0 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
1b300 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1b310 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
1b320 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
1b330 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
1b340 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
1b350 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
1b360 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
1b370 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
1b380 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b390 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1b3a0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
1b3b0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
1b3c0 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
1b3d0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
1b3e0 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
1b3f0 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
1b400 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
1b410 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
1b420 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
1b430 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
1b440 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
1b450 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
1b460 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
1b470 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1b480 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1b490 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
1b4a0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1b4b0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
1b4c0 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
1b4d0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
1b4e0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
1b4f0 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
1b500 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
1b510 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
1b520 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
1b530 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
1b540 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
1b550 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
1b560 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
1b570 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
1b580 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
1b590 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b5a0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
1b5b0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
1b5c0 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
1b5d0 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
1b5e0 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
1b5f0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1b600 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
1b610 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
1b620 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
1b630 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
1b640 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
1b650 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
1b660 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
1b670 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
1b680 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
1b690 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1b6a0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
1b6b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1b6c0 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
1b6d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1b6e0 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
1b6f0 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
1b700 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
1b710 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
1b720 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
1b730 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1b740 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
1b750 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
1b760 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
1b770 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1b780 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
1b790 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
1b7a0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1b7b0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1b7c0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
1b7d0 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
1b7e0 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
1b7f0 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
1b800 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
1b810 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
1b820 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
1b830 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
1b840 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
1b850 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
1b860 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1b870 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
1b880 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
1b890 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
1b8a0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
1b8b0 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
1b8c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
1b8d0 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
1b8e0 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
1b8f0 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
1b900 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
1b910 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1b920 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
1b930 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b940 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1b950 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b970 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
1b980 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
1b990 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
1b9c0 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
1b9d0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1ba00 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1ba10 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
1ba20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ba30 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1ba40 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
1ba50 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba70 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
1ba80 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1ba90 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
1baa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1bab0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1bac0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1bad0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1bae0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1baf0 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
1bb00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1bb10 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
1bb20 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
1bb30 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
1bb40 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
1bb50 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
1bb60 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e  lback */.  int n
1bb70 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20  Playback = 0;   
1bb80 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1bb90 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73  ber of pages res
1bba0 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e  tored from journ
1bbb0 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  al */..  /* Figu
1bbc0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1bbd0 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1bbe0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1bbf0 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1bc00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1bc10 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1bc20 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1bc30 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1bc40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1bc50 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1bc60 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1bc70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bc80 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1bc90 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1bca0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1bcb0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1bcc0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1bcd0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1bce0 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1bcf0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1bd00 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1bd10 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1bd20 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1bd30 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1bd40 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1bd50 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1bd60 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1bd70 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1bd80 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1bd90 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1bda0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1bdb0 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1bdc0 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1bdd0 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1bde0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1bdf0 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1be00 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1be10 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1be20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1be30 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1be40 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1be50 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1be60 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
1be70 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1be80 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1be90 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1bea0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1beb0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1bec0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1bed0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1bee0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1bef0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1bf00 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1bf10 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1bf20 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1bf30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf40 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1bf50 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1bf60 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1bf70 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1bf80 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1bf90 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1bfa0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1bfb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bfc0 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1bfd0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1bfe0 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1bff0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1c000 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1c010 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1c020 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1c030 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1c040 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1c050 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1c060 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1c070 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1c080 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1c090 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1c0a0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1c0b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1c0c0 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1c0d0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1c0e0 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1c0f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1c100 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1c110 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1c120 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1c130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1c140 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1c150 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1c160 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1c170 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1c180 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1c190 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1c1a0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1c1b0 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1c1c0 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1c1d0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1c1e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1c1f0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1c200 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1c210 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1c220 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c230 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1c240 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1c250 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1c260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c270 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1c280 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c290 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1c2a0 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1c2b0 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1c2c0 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1c2d0 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1c2e0 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1c2f0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1c300 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1c310 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1c320 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1c330 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1c340 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1c350 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1c360 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1c370 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1c380 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1c390 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1c3a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1c3b0 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1c3c0 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1c3d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1c3e0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1c3f0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1c400 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1c410 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1c420 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c430 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1c440 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1c450 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1c460 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1c470 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1c480 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1c490 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1c4a0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1c4b0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1c4c0 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1c4d0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1c4e0 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1c4f0 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1c500 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1c510 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1c520 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1c530 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1c540 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1c550 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1c560 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1c570 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1c580 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1c590 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1c5a0 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1c5b0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1c5c0 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1c5d0 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1c5e0 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1c5f0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1c600 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1c610 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1c620 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1c630 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1c640 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1c650 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1c660 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1c670 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1c680 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1c690 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1c6a0 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1c6b0 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1c6c0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1c6d0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1c6e0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1c6f0 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1c700 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1c710 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1c720 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1c730 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1c740 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1c750 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1c760 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1c770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1c780 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1c790 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1c7a0 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1c7b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1c7c0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1c7d0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1c7e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1c7f0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1c800 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1c810 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1c820 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1c830 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1c840 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c850 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1c860 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1c870 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1c880 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1c890 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1c8a0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1c8b0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1c8c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1c8d0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1c8e0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c8f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1c900 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1c910 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1c920 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c940 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c950 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c960 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1c970 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1c980 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1c990 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1c9a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1c9b0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1c9c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1c9d0 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1c9e0 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1c9f0 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1ca00 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1ca10 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1ca20 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1ca30 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1ca40 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1ca50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1ca60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1ca70 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1ca80 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1ca90 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1caa0 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1cab0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1cad0 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20  nPlayback++;.   
1cae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1caf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cb00 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1cb10 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cb20 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1cb30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1cb40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cb50 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1cb60 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1cb70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1cb80 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1cb90 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1cba0 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1cbb0 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1cbc0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1cbd0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1cbe0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1cbf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1cc00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1cc10 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1cc20 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1cc30 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1cc40 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1cc50 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1cc60 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1cc70 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1cc80 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1cc90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1cca0 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1ccb0 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1ccc0 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1ccd0 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1cce0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ccf0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1cd00 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1cd10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cd20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1cd30 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1cd40 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1cd50 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1cd60 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1cd70 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1cd80 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1cd90 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1cda0 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1cdb0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1cdc0 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1cdd0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1cde0 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1cdf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1ce00 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1ce10 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1ce20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1ce30 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1ce40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1ce50 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ce60 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1ce70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ce80 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1ce90 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1cea0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1ceb0 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1cec0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1ced0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1cee0 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1cef0 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1cf00 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1cf10 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1cf20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1cf30 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1cf40 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1cf50 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1cf60 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1cf70 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1cf80 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1cf90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cfa0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1cfb0 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64  ified..  */.#ifd
1cfc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1cfd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
1cfe0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1cff0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1d000 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
1d010 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1d020 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1d030 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
1d040 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1d050 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1d060 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1d070 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1d080 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1d090 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1d0a0 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1d0b0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d0c0 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1d0d0 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1d0e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d0f0 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1d100 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1d110 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1d120 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1d130 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1d140 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1d150 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1d160 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1d170 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1d180 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1d190 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1d1a0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1d1b0 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1d1c0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d1d0 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1d1e0 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1d1f0 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1d200 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1d210 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1d220 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1d230 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1d240 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1d250 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1d260 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1d270 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1d280 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1d290 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1d2a0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1d2b0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1d2c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d2d0 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1d2e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1d2f0 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1d300 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1d310 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1d320 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1d330 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1d340 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1d350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d360 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1d370 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1d380 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1d390 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1d3a0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1d3b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1d3c0 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1d3d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1d3e0 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nc(pPager, 0);. 
1d3f0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1d410 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1d420 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
1d430 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
1d440 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63  ', 0);.    testc
1d450 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d460 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d480 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
1d490 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
1d4a0 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
1d4b0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
1d4c0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1d4d0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
1d4e0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
1d4f0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1d500 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1d510 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
1d520 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1d530 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
1d540 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1d550 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1d560 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1d570 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20  .  if( isHot && 
1d580 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20  nPlayback ){.   
1d590 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
1d5a0 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
1d5b0 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65  ER_ROLLBACK, "re
1d5c0 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73  covered %d pages
1d5d0 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20   from %s",.     
1d5e0 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79             nPlay
1d5f0 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  back, pPager->zJ
1d600 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20  ournal);.  }..  
1d610 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
1d620 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1d630 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
1d640 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
1d650 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
1d660 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
1d670 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
1d680 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
1d690 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
1d6a0 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
1d6b0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
1d6c0 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
1d6d0 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
1d6e0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
1d6f0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
1d700 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
1d710 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
1d720 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
1d730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d740 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20  le and into .** 
1d750 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68  pPg->pData. A sh
1d760 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ared lock or gre
1d770 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
1d780 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1d790 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65  e.** file before
1d7a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d7b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
1d7c0 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61  If page 1 is rea
1d7d0 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
1d7e0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
1d7f0 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74  eVers[] is set t
1d800 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  o.** the value r
1d810 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
1d820 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1d830 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
1d840 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1d850 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65  e IO error is re
1d860 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1d870 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ller..** Otherwi
1d880 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
1d890 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1d8a0 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
1d8b0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20  age(PgHdr *pPg, 
1d8c0 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50  u32 iFrame){.  P
1d8d0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1d8e0 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
1d8f0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
1d900 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1d910 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
1d920 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1d930 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1d940 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
1d950 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d960 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1d970 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1d980 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  /.  int pgsz = p
1d990 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1d9a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1d9b0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  tes to read */..
1d9c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d9d0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1d9e0 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1d9f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1da00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1da10 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1da20 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69  ITE_OMIT_WAL.  i
1da30 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20  f( iFrame ){.   
1da40 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20   /* Try to pull 
1da50 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1da60 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  e write-ahead lo
1da70 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1da80 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61  qlite3WalReadFra
1da90 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1daa0 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70   iFrame, pgsz, p
1dab0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65  Pg->pData);.  }e
1dac0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1dad0 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d     i64 iOffset =
1dae0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
1daf0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1db00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1db10 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1db20 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
1db30 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a  pgsz, iOffset);.
1db40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1db50 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1db60 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
1db70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1db80 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67   }.  }..  if( pg
1db90 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  no==1 ){.    if(
1dba0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
1dbb0 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75  If the read is u
1dbc0 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74  nsuccessful, set
1dbd0 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b   the dbFileVers[
1dbe0 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20  ] to something. 
1dbf0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c       ** that wil
1dc00 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c  l never be a val
1dc10 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e  id file version.
1dc20 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69    dbFileVers[] i
1dc30 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a  s a copy.      *
1dc40 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33  * of bytes 24..3
1dc50 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1dc60 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31  e.  Bytes 28..31
1dc70 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1dc80 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  e.      ** zero 
1dc90 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
1dca0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1dcb0 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33  age. Bytes 32..3
1dcc0 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20  5 and 35..39.   
1dcd0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1dce0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69  page numbers whi
1dcf0 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66  ch are never 0xf
1dd00 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c  fffffff.  So fil
1dd10 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50  ling.      ** pP
1dd20 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1dd30 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66  [] with all 0xff
1dd40 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75   bytes should su
1dd50 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  ffice..      **.
1dd60 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20        ** For an 
1dd70 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1dd80 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f  se, the situatio
1dd90 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  n is more comple
1dda0 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20  x:  bytes.      
1ddb0 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  ** 24..39 of the
1ddc0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68   database are wh
1ddd0 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20  ite noise.  But 
1dde0 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
1ddf0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74  of.      ** whit
1de00 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67  e noise equaling
1de10 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1de20 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1de30 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1de40 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1de50 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1de60 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1de70 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1de80 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1de90 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1dea0 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1deb0 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1dec0 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1ded0 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1dee0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1def0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1df00 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1df10 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1df20 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1df30 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1df40 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1df50 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  a, pgno, 3, rc =
1df60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
1df70 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1df80 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1df90 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1dfa0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1dfb0 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1dfc0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1dfd0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1dfe0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1dff0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1e000 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1e010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e020 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e030 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1e040 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1e050 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e060 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1e070 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1e080 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1e090 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1e0a0 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1e0b0 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1e0c0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1e0d0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1e0e0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1e0f0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1e100 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1e110 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1e120 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1e130 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1e140 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1e150 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1e160 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1e170 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1e180 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1e190 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1e1a0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1e1b0 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1e1c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e1d0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1e1e0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1e1f0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1e200 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1e210 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1e220 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1e230 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1e240 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1e250 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1e260 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1e270 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1e280 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e290 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1e2a0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1e2b0 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1e2c0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1e2d0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1e2e0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1e2f0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1e300 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1e310 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1e320 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1e330 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1e340 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1e350 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1e360 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1e370 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1e380 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1e390 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1e3a0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e3b0 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1e3c0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1e3d0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1e3e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e3f0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1e400 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1e410 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1e420 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1e430 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1e440 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e450 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1e460 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1e470 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1e480 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1e490 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1e4a0 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1e4b0 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1e4c0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1e4d0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1e4e0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1e4f0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1e500 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1e510 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1e520 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1e530 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1e540 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1e550 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1e560 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1e570 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1e580 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1e590 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1e5a0 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1e5b0 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1e5c0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1e5d0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1e5e0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1e5f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e600 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1e610 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1e620 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1e630 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1e640 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1e650 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1e660 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1e670 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1e680 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1e6a0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1e6b0 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1e6c0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1e6d0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e6e0 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1e6f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1e700 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1e710 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1e720 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1e730 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1e740 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1e750 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e760 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1e770 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1e780 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1e790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e7a0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e7b0 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e7c0 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e7d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e7e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e7f0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e800 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
1e810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e830 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e840 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1e850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e860 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e870 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  fNotNull(pPg);. 
1e880 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1e890 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1e8a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e8b0 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1e8c0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1e8d0 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1e8e0 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1e8f0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1e900 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1e910 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1e920 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1e930 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1e940 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1e950 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1e960 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1e970 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1e980 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1e990 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1e9a0 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1e9b0 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1e9c0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1e9d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1e9e0 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1e9f0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1ea00 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1ea10 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1ea20 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1ea30 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1ea40 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1ea50 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1ea60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1ea70 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1ea80 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1ea90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1eaa0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1eab0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1eac0 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1ead0 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1eae0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1eaf0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1eb00 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1eb10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1eb20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1eb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1eb40 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1eb50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb70 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1eb80 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1eb90 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1eba0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1ebb0 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1ebc0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1ebd0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1ebe0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1ebf0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1ec00 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1ec10 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1ec20 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1ec30 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1ec40 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1ec50 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1ec60 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1ec70 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1ec80 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1ec90 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1eca0 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1ecb0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1ecc0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1ecd0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1ece0 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1ecf0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1ed00 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1ed10 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1ed20 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1ed30 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1ed40 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1ed50 68 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  he);..#ifndef SQ
1ed60 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
1ed70 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 69  RENT.  /* If thi
1ed80 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45  s is an CONCURRE
1ed90 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  NT transaction, 
1eda0 74 68 65 6e 20 70 61 67 65 20 31 20 6d 75 73 74  then page 1 must
1edb0 20 62 65 20 72 65 72 65 61 64 20 66 72 6f 6d 20   be reread from 
1edc0 0a 20 20 2a 2a 20 74 68 65 20 64 62 20 66 69 6c  .  ** the db fil
1edd0 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69 73  e, even if it is
1ede0 20 6e 6f 74 20 64 69 72 74 79 2e 20 54 68 69 73   not dirty. This
1edf0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1ee00 62 2d 74 72 65 65 20 6c 61 79 65 72 20 0a 20 20  b-tree layer .  
1ee10 2a 2a 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65  ** may have alre
1ee20 61 64 79 20 7a 65 72 6f 65 64 20 74 68 65 20 6e  ady zeroed the n
1ee30 46 72 65 65 20 61 6e 64 20 69 54 72 75 6e 6b 20  Free and iTrunk 
1ee40 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 20  header fields.  
1ee50 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1ee60 49 54 45 5f 4f 4b 20 26 26 20 28 70 4c 69 73 74  ITE_OK && (pList
1ee70 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67  ==0 || pList->pg
1ee80 6e 6f 21 3d 31 29 20 26 26 20 70 50 61 67 65 72  no!=1) && pPager
1ee90 2d 3e 70 41 6c 6c 52 65 61 64 20 29 7b 0a 20 20  ->pAllRead ){.  
1eea0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1eeb0 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 2a 29  Callback((void*)
1eec0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a  pPager, 1);.  }.
1eed0 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
1eee0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1eef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1ef00 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1ef10 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1ef20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1ef30 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1ef40 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1ef50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1ef60 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1ef70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ef80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ef90 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1efa0 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1efb0 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1efc0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1efd0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1efe0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1eff0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1f000 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1f010 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1f020 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1f030 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1f040 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1f050 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1f060 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1f070 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1f080 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1f090 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1f0a0 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1f0b0 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1f0c0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1f0d0 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1f0e0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1f0f0 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1f100 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1f110 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1f120 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1f130 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1f160 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1f170 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f180 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f190 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1f1a0 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1f1b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f1c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1f1d0 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1f1e0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1f1f0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1f200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f210 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1f220 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1f230 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f250 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f260 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f290 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1f2a0 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  /.  PgHdr *p;   
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2c0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1f2d0 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1f2e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1f2f0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1f300 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1f310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1f320 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1f330 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1f340 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1f350 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1f360 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1f370 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1f380 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1f390 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1f3a0 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1f3b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f3c0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1f3d0 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1f3e0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1f3f0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1f400 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1f410 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1f420 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1f430 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1f440 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1f450 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1f460 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1f470 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1f480 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1f490 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1f4a0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1f4b0 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1f4c0 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1f4d0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1f4e0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1f4f0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1f500 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1f510 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b  ;.    nList = 0;
1f520 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1f530 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21  ; (*ppNext = p)!
1f540 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  =0; p=p->pDirty)
1f550 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1f560 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29  gno<=nTruncate )
1f570 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74  {.        ppNext
1f580 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20   = &p->pDirty;. 
1f590 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a         nList++;.
1f5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f5b0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1f5c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f5d0 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  nList = 1;.  }. 
1f5e0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
1f5f0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
1f600 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66   += nList;..  if
1f610 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
1f620 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
1f630 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
1f640 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
1f650 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
1f660 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
1f670 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1f680 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
1f690 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
1f6a0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
1f6b0 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
1f6c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f6d0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
1f6e0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   ){.    for(p=pL
1f6f0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1f700 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1f710 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1f720 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1f730 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1f740 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1f750 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1f760 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1f770 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f780 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1f790 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f7a0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
1f7b0 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1f7c0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
1f7d0 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
1f7e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1f7f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f800 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1f810 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1f820 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1f830 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1f840 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1f850 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1f860 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1f870 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1f880 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1f890 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1f8a0 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1f8b0 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1f8c0 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1f8d0 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1f8e0 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1f8f0 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1f900 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1f910 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1f920 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1f930 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f940 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1f950 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1f960 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1f970 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f990 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1f9a0 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1f9b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f9c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1f9d0 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1f9e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1f9f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1fa00 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1fa10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1fa20 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1fa30 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fa40 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1fa50 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1fa60 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1fa70 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1fa80 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1fa90 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1faa0 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1fab0 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1fac0 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1fad0 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1fae0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1faf0 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1fb00 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1fb10 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1fb20 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1fb30 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1fb40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1fb50 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1fb60 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1fb70 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1fb80 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1fb90 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1fba0 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1fbb0 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
1fbc0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
1fbd0 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1fbe0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1fbf0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
1fc00 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
1fc10 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
1fc20 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
1fc30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1fc40 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1fc50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1fc60 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1fc70 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1fc80 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1fc90 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1fca0 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1fcb0 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1fcc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fcd0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1fce0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1fcf0 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1fd00 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1fd10 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1fd20 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1fd30 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1fd40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1fd50 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1fd60 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1fd70 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1fd80 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1fd90 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1fda0 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1fdb0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1fdc0 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1fdd0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1fde0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1fdf0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1fe00 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1fe10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1fe20 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1fe30 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1fe60 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1fe70 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1fe80 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1fe90 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1fea0 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1feb0 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1fec0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1fed0 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1fee0 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1fef0 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1ff00 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1ff10 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1ff20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
1ff30 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ff40 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
1ff50 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1ff60 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
1ff70 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
1ff80 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
1ff90 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
1ffa0 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
1ffb0 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
1ffc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ffd0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1ffe0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1fff0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
20000 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
20010 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
20020 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
20030 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49  ->pWal);..  /* I
20040 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
20050 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
20060 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61  abase is not ava
20070 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a  ilable from the.
20080 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73    ** WAL sub-sys
20090 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  tem, determine t
200a0 68 65 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62  he page counte b
200b0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ased on the size
200c0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   of.  ** the dat
200d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
200e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
200f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20100 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74   not an.  ** int
20110 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
20120 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
20130 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65 73  round up the res
20140 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
20150 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20160 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20180 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
20190 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
201a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
201b0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
201c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
201d0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
201e0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
201f0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
20200 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
20210 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
20220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20240 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20260 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
20270 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67  )((n+pPager->pag
20280 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65  eSize-1) / pPage
20290 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
202a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
202b0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
202c0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
202d0 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
202e0 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
202f0 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
20300 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
20310 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
20320 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
20330 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
20340 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
20350 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
20360 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
20370 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
20380 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
20390 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
203a0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
203b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
203c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
203d0 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65  IT_WAL./*.** Che
203e0 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
203f0 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
20400 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
20410 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
20420 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
20430 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20440 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
20450 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
20460 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
20470 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
20480 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
20490 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
204a0 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
204b0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
204c0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
204d0 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
204e0 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
204f0 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
20500 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
20510 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
20520 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
20530 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
20540 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
20550 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
20560 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
20570 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
20580 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
20590 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
205a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
205b0 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
205c0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
205d0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
205e0 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
205f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20600 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
20610 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
20620 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
20630 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
20640 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
20650 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
20660 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
20670 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
20680 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
20690 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
206a0 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
206b0 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
206c0 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
206d0 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
206e0 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
206f0 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
20700 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
20710 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
20720 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
20730 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20740 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20750 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
20760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
20770 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
20780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
20790 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
207a0 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
207b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
207c0 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
207f0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
20800 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20820 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
20840 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
20850 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20860 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
20870 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
20880 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
20890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
208a0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
208b0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
208c0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
208d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
208e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
208f0 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d  ETE_NOENT ) rc =
20900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20910 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
20920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
20930 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
20940 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
20950 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
20960 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
20970 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
20980 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
20990 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
209a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
209b0 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
209c0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
209d0 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
209e0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
209f0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
20a00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
20a10 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
20a20 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
20a30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
20a40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20a50 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
20a60 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
20a70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
20a80 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
20a90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
20aa0 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
20ab0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20ac0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
20ad0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
20ae0 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
20af0 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
20b00 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
20b10 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
20b20 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
20b30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
20b40 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
20b50 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
20b60 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
20b70 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
20b80 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
20b90 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
20ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
20bb0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
20bc0 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
20bd0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
20be0 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
20bf0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
20c00 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
20c10 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
20c20 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
20c30 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
20c40 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
20c50 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
20c60 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
20c70 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
20c80 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
20c90 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
20ca0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
20cb0 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
20cc0 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
20cd0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
20ce0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20cf0 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
20d00 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20d10 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
20d20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
20d30 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
20d40 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
20d50 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20d60 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
20d70 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
20d80 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20d90 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
20da0 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
20db0 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
20dc0 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
20dd0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
20de0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
20df0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
20e00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20e10 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
20e20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
20e30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
20e40 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
20e50 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
20e60 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
20e70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
20e80 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
20e90 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
20ea0 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
20eb0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20ec0 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
20ed0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
20ee0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
20ef0 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
20f00 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
20f10 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
20f20 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
20f30 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
20f40 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
20f50 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
20f60 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
20f70 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
20f80 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
20f90 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
20fa0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
20fb0 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
20fc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
20fd0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
20fe0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
20ff0 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
21000 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
21010 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
21020 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
21030 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
21040 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
21050 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
21060 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
21070 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
21080 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
21090 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
210a0 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
210b0 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
210c0 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
210d0 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
210e0 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
210f0 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
21100 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
21110 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
21120 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
21130 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
21140 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
21150 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
21160 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
21170 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
21180 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
21190 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
211a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
211b0 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
211c0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
211d0 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
211e0 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
211f0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
21200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
21210 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
21220 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21230 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
21240 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
21250 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
21260 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
21270 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
21280 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
21290 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
212a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
212b0 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
212c0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
212d0 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
212e0 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
212f0 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
21300 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21310 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
21320 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
21330 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
21340 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
21350 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  CKED );..  /* Al
21360 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
21370 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
21380 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
21390 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
213a0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
213b0 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
213c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
213d0 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
213e0 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
213f0 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
21400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
21410 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
21420 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
21430 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
21440 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
21450 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
21460 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
21470 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
21480 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
21490 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
214a0 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
214b0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
214c0 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
214d0 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
214e0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
214f0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
21500 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
21510 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
21520 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
21540 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
21550 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
21560 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
21570 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
21580 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
21590 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
215a0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
215b0 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
215c0 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
215d0 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
215e0 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
215f0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
21600 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
21610 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
21620 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
21630 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
21640 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
21650 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
21660 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
21670 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
21680 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
21690 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
216a0 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
216b0 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
216c0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
216d0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
216e0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
216f0 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
21700 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
21710 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21720 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
21730 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
21740 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
21750 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
21760 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
21770 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
21780 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
21790 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
217a0 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
217b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
217c0 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
217d0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
217e0 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
217f0 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
21800 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
21810 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
21820 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
21830 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
21840 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21850 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
21860 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
21870 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
21880 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
21890 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
218a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
218b0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
218c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
218d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
218e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
218f0 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
21900 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21910 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21920 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21940 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21950 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21970 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
21980 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21990 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
219a0 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
219b0 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
219c0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
219d0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
219e0 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
219f0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
21a00 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
21a10 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
21a20 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
21a30 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
21a40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
21a50 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
21a60 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
21a70 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
21a80 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
21a90 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
21aa0 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
21ab0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21ac0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
21ad0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
21ae0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
21af0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21b00 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21b10 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
21b20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21b30 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
21b40 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
21b50 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
21b60 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
21b70 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
21b80 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
21b90 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21ba0 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
21bb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
21bc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21bd0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21be0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21bf0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
21c00 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
21c10 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
21c20 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
21c30 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
21c40 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
21c50 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
21c60 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
21c70 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
21c80 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
21c90 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
21ca0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21cb0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21cc0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21cd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
21ce0 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
21cf0 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
21d00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21d10 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
21d20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
21d30 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
21d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21d50 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
21d60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
21d70 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
21d80 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21d90 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21da0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
21db0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
21dc0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
21dd0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21de0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21df0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21e00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
21e10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
21e20 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
21e30 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
21e40 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
21e50 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
21e60 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
21e70 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
21e80 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
21e90 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21ea0 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
21eb0 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
21ec0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
21ed0 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
21ee0 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
21ef0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
21f00 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
21f10 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21f20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21f30 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
21f40 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
21f50 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
21f60 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
21f70 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
21f80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
21f90 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
21fa0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
21fb0 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
21fc0 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
21fd0 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
21fe0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21ff0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
22000 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
22010 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
22020 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
22030 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22040 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
22050 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
22060 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
22070 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
22080 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
22090 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
220a0 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
220b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
220c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
220d0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
220e0 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
220f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
22110 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22120 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
22130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22140 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
22150 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
22160 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
22170 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
22180 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22190 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
221a0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
221b0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
221c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
221d0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
221e0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
221f0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ge);.}../*.** In
22200 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  voke SQLITE_FCNT
22210 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65  L_MMAP_SIZE base
22220 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
22230 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70   value of szMmap
22240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22250 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
22260 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
22270 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
22280 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73  _MMAP_SIZE>0.  s
22290 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
222a0 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20  = pPager->fd;.  
222b0 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26  if( isOpen(fd) &
222c0 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  & fd->pMethods->
222d0 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20  iVersion>=3 ){. 
222e0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
222f0 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50   sz;.    sz = pP
22300 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20  ager->szMmap;.  
22310 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65    pPager->bUseFe
22320 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20  tch = (sz>0);.  
22330 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
22340 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
22350 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
22360 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26  NTL_MMAP_SIZE, &
22370 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sz);.  }.#endif.
22380 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
22390 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
223a0 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d   of any memory m
223b0 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74  apping made of t
223c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
223d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
223e0 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
223f0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22400 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
22410 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65  szMmap){.  pPage
22420 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  r->szMmap = szMm
22430 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61  ap;.  pagerFixMa
22440 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
22450 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
22460 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
22470 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
22480 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
22490 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
224a0 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
224b0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
224c0 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
224d0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
224e0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74  *.** Adjust sett
224f0 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
22500 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  r to those speci
22510 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c  fied in the pgFl
22520 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ags parameter..*
22530 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22  *.** The "level"
22540 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41   in pgFlags & PA
22550 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
22560 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f  MASK sets the ro
22570 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74  bustness.** of t
22580 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
22590 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
225a0 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72  crashes or power
225b0 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20   failures by.** 
225c0 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
225d0 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
225e0 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  when writing the
225f0 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
22600 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
22610 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
22620 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
22630 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
22640 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
22650 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
22660 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
22670 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
22680 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
22690 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
226a0 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
226b0 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
226c0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
226d0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
226e0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
226f0 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
22700 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
22710 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
22720 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22730 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
22740 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
22750 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
22760 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
22770 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
22780 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
22790 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
227a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
227c0 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
227d0 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
227e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
227f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22800 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
22810 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
22820 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
22830 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
22840 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
22850 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
22860 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22870 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
22880 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
22890 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
228a0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
228b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
228c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
228d0 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
228e0 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
228f0 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
22900 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
22910 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
22920 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
22940 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
22950 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
22960 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
22970 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
22980 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
22990 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
229a0 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
229b0 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
229c0 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
229d0 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
229e0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
229f0 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
22a00 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  ck..**.** The ab
22a10 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c  ove is for a rol
22a20 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  lback-journal mo
22a30 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64  de.  For WAL mod
22a40 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73  e, OFF continues
22a50 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74  .** to mean that
22a60 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f   no syncs ever o
22a70 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65  ccur.  NORMAL me
22a80 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
22a90 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72   is synced.** pr
22aa0 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
22ab0 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   of checkpoint a
22ac0 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
22ad0 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e  base file is syn
22ae0 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  ced.** at the co
22af0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20  nclusion of the 
22b00 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
22b10 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
22b20 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77   of the WAL.** w
22b30 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  as written back 
22b40 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
22b50 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20  e.  But no sync 
22b60 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72  operations occur
22b70 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e   for.** an ordin
22b80 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f  ary commit in NO
22b90 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57  RMAL mode with W
22ba0 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20  AL.  FULL means 
22bb0 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20  that the WAL.** 
22bc0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66  file is synced f
22bd0 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f  ollowing each co
22be0 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20  mmit operation, 
22bf0 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  in addition to t
22c00 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f  he.** syncs asso
22c10 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d  ciated with NORM
22c20 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  AL..**.** Do not
22c30 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f   confuse synchro
22c40 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53  nous=FULL with S
22c50 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e  QLITE_SYNC_FULL.
22c60 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
22c70 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20  SYNC_FULL macro 
22c80 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65  means to use the
22c90 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75   MacOSX-style fu
22ca0 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e  ll-fsync.** usin
22cb0 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53  g fcntl(F_FULLFS
22cc0 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59  YNC).  SQLITE_SY
22cd0 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  NC_NORMAL means 
22ce0 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69  to do an.** ordi
22cf0 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c  nary fsync() cal
22d00 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  l.  There is no 
22d10 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
22d20 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  en SQLITE_SYNC_F
22d30 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  ULL.** and SQLIT
22d40 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e  E_SYNC_NORMAL on
22d50 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72   platforms other
22d60 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42   than MacOSX.  B
22d70 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72  ut the.** synchr
22d80 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75  onous=FULL versu
22d90 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  s synchronous=NO
22da0 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74  RMAL setting det
22db0 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20  ermines when.** 
22dc0 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74  the xSync primit
22dd0 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e  ive is called an
22de0 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  d is relevant to
22df0 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a   all platforms..
22e00 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
22e10 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
22e20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
22e30 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
22e40 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
22e50 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
22e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
22e70 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
22e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22e90 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a  Flags(.  Pager *
22ea0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
22eb0 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73  * The pager to s
22ec0 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  et safety level 
22ed0 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  for */.  unsigne
22ee0 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f  d pgFlags      /
22ef0 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20  * Various flags 
22f00 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
22f10 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73   level = pgFlags
22f20 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   & PAGER_SYNCHRO
22f30 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73 73  NOUS_MASK;.  ass
22f40 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26  ert( level>=1 &&
22f50 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70   level<=3 );.  p
22f60 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
22f70 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50   (level==1 || pP
22f80 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
22f90 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
22fa0 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65  fullSync = (leve
22fb0 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
22fc0 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
22fd0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
22fe0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  oSync ){.    pPa
22ff0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
23000 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
23010 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
23020 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
23030 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  gFlags & PAGER_F
23040 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20  ULLFSYNC ){.    
23050 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23060 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23070 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  FULL;.    pPager
23080 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
23090 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
230a0 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LL;.  }else if( 
230b0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
230c0 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29  CKPT_FULLFSYNC )
230d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
230e0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
230f0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
23100 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
23110 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23120 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
23130 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23140 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
23150 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
23170 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
23180 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23190 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77  .  }.  pPager->w
231a0 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50  alSyncFlags = pP
231b0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b  ager->syncFlags;
231c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
231d0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
231e0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
231f0 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f  ags |= WAL_SYNC_
23200 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
23210 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73 20  }.  if( pgFlags 
23220 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50 49  & PAGER_CACHESPI
23230 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  LL ){.    pPager
23240 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
23250 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a  ~SPILLFLAG_OFF;.
23260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
23270 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
23280 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  |= SPILLFLAG_OFF
23290 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
232a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
232b0 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
232c0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
232d0 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
232e0 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
232f0 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
23300 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
23310 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
23320 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
23330 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
23340 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
23350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
23360 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
23370 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
23380 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
23390 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
233a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
233b0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
233c0 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
233d0 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
233e0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
233f0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
23400 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
23410 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
23420 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
23430 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
23440 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
23450 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
23460 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
23470 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
23480 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
23490 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
234a0 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
234b0 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
234c0 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
234d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
234e0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
234f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
23500 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23510 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
23520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
23530 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
23540 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23550 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
23560 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
23570 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
23580 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
23590 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
235a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
235b0 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
235c0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
235d0 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
235e0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
235f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
23600 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
23610 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
23620 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23630 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
23640 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
23650 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
23660 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
23670 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
23680 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
23690 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
236a0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
236b0 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
236c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
236d0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
236e0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
236f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23700 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
23710 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23720 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
23730 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
23740 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
23750 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
23760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
23770 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
23780 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
23790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
237a0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
237b0 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
237c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
237d0 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
237e0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
237f0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
23800 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
23810 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
23820 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
23830 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
23840 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
23850 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
23860 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
23870 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
23880 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
23890 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
238a0 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
238b0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
238c0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
238d0 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
238e0 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
238f0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
23900 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
23910 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
23920 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
23930 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
23940 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
23950 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
23980 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
23990 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
239a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
239b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
239c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
239d0 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
239e0 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
239f0 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
23a00 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
23a10 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
23a20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
23a30 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
23a40 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
23a50 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
23a60 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
23a70 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
23a80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
23a90 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
23aa0 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
23ab0 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
23ac0 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
23ad0 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
23ae0 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
23af0 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
23b00 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
23b10 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
23b20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
23b30 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
23b40 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
23b50 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
23b60 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23b80 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
23b90 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
23ba0 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
23bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
23bc0 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
23bd0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
23be0 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
23bf0 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
23c00 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
23c10 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
23c20 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
23c30 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
23c40 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
23c50 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
23c60 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
23c70 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
23c80 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  Arg;..  if( isOp
23c90 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
23ca0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20  {.    void **ap 
23cb0 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67  = (void **)&pPag
23cc0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
23cd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
23ce0 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28  int(*)(void *))(
23cf0 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61  ap[0]))==xBusyHa
23d00 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73  ndler );.    ass
23d10 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73  ert( ap[1]==pBus
23d20 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20  yHandlerArg );. 
23d30 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
23d40 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
23d50 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
23d60 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52  CNTL_BUSYHANDLER
23d70 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20  , (void *)ap);. 
23d80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
23d90 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
23da0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
23db0 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
23dc0 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
23dd0 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
23de0 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
23df0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
23e00 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
23e10 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
23e20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
23e30 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
23e40 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
23e50 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
23e60 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
23e70 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
23e80 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
23e90 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  R, an SQLITE_IOE
23ea0 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20  RR_xxx sub-code 
23eb0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
23ec0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23ed0 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
23ee0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
23ef0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
23f00 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
23f10 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
23f20 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
23f30 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
23f40 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
23f50 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
23f60 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
23f70 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
23f80 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
23f90 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
23fa0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
23fb0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
23fc0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
23fd0 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
23fe0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
23ff0 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
24000 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
24010 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
24020 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
24030 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
24040 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
24050 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
24060 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
24070 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
24080 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
24090 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
240a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
240b0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
240c0 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
240d0 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
240e0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
240f0 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
24100 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24110 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
24120 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
24130 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
24140 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
24150 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
24160 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
24170 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24180 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
24190 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
241a0 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
241b0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
241c0 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
241d0 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
241e0 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
241f0 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
24200 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
24210 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
24220 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
24230 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
24240 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
24250 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
24260 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
24270 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
24280 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
24290 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
242a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
242b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
242c0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
242d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
242e0 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  32 *pPageSize, i
242f0 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
24300 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24310 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  OK;..  /* It is 
24320 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
24330 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74  do a full assert
24340 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68  _pager_state() h
24350 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a  ere, as this.  *
24360 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  * function may b
24370 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
24380 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29  thin PagerOpen()
24390 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61  , before the sta
243a0 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50  te.  ** of the P
243b0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69  ager object is i
243c0 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73  nternally consis
243d0 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tent..  **.  ** 
243e0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
243f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
24400 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ned an error if 
24410 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
24420 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52   .  ** PAGER_ERR
24430 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69  OR state. But si
24440 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20  nce PAGER_ERROR 
24450 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73  state guarantees
24460 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65   that.  ** there
24470 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
24480 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24490 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69  e reference, thi
244a0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
244b0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
244c0 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e  hat case anyhow.
244d0 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67  .  */..  u32 pag
244e0 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
244f0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ze;.  assert( pa
24500 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
24510 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
24520 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
24530 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
24540 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
24550 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
24560 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
24570 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
24580 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
24590 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
245a0 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20  .   && pageSize 
245b0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33  && pageSize!=(u3
245c0 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
245d0 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  ze .  ){.    cha
245e0 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20  r *pNew = NULL; 
245f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24600 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f  ew temp space */
24610 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d  .    i64 nByte =
24620 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   0;..    if( pPa
24630 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
24640 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e  R_OPEN && isOpen
24650 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
24660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24670 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
24680 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29  ger->fd, &nByte)
24690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
246a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
246b0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63  .      pNew = (c
246c0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
246d0 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
246e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
246f0 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ew ) rc = SQLITE
24700 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
24710 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
24730 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
24740 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
24750 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
24760 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
24770 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
24780 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
24790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
247a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
247b0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
247c0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
247d0 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
247e0 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
247f0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
24800 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65   = (Pgno)((nByte
24810 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67  +pageSize-1)/pag
24820 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
24830 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
24840 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d   pageSize;.    }
24850 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
24860 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65 77  te3PageFree(pNew
24870 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
24880 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  *pPageSize = pPa
24890 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
248a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
248b0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
248c0 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
248d0 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
248e0 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
248f0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
24900 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
24910 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
24920 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
24930 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
24940 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
24950 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72  ager);.    pager
24960 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
24970 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
24980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
24990 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
249a0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
249b0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
249c0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
249d0 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
249e0 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
249f0 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
24a00 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
24a10 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
24a20 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
24a30 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
24a40 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
24a50 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
24a60 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
24a70 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
24a80 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
24a90 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
24aa0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
24ab0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
24ac0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
24ad0 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
24ae0 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
24af0 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
24b00 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
24b10 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
24b20 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
24b30 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
24b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
24b50 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
24b60 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
24b70 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
24b80 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
24b90 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
24ba0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
24bb0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
24bc0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
24bd0 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
24be0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
24bf0 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
24c00 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
24c10 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
24c20 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
24c30 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
24c40 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
24c50 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
24c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
24c70 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
24c80 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
24c90 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
24ca0 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
24cb0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
24cc0 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  age;.  }.  asser
24cd0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24ce0 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e!=PAGER_OPEN );
24cf0 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20        /* Called 
24d00 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67  only by OP_MaxPg
24d10 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  cnt */.  assert(
24d20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e   pPager->mxPgno>
24d30 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
24d40 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63  );  /* OP_MaxPgc
24d50 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73  nt enforces this
24d60 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61   */.  return pPa
24d70 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
24d80 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
24d90 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
24da0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
24db0 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
24dc0 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
24dd0 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
24de0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
24df0 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
24e00 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
24e10 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
24e20 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
24e30 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
24e40 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
24e50 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
24e60 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
24e70 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
24e80 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
24e90 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
24ea0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
24eb0 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
24ec0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24ed0 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
24ee0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
24ef0 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
24f00 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
24f10 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
24f20 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24f30 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
24f40 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
24f50 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
24f60 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
24f70 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
24f80 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
24f90 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24fa0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
24fb0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24fc0 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
24fd0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
24fe0 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
24ff0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
25000 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
25010 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25020 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
25030 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
25040 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
25050 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
25060 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
25070 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
25080 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
25090 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
250a0 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
250b0 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
250c0 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
250d0 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
250e0 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
250f0 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
25100 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
25110 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
25120 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
25130 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
25140 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
25150 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
25160 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
25170 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
25180 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
25190 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
251a0 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
251b0 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
251c0 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
251d0 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
251e0 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
251f0 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
25200 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
25210 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
25220 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
25230 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
25240 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
25250 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
25260 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
25270 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
25280 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
25290 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
252a0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
252b0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
252c0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
252d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
252e0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
252f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
25300 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
25310 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
25320 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
25330 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
25340 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  le );..  /* This
25350 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
25360 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65   called by btree
25370 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
25380 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  er creating.  **
25390 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
253a0 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f  t.  There has no
253b0 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74  t been an opport
253c0 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74  unity to transit
253d0 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20  ion.  ** to WAL 
253e0 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  mode yet..  */. 
253f0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
25400 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
25410 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
25420 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
25430 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
25440 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
25450 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
25460 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
25470 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
25480 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
25490 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
254a0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
254b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
254c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
254d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
254e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
254f0 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62  ction may only b
25500 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  e called when a 
25510 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
25520 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74   is open on.** t
25530 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74  he pager. It ret
25540 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  urns the total n
25550 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
25560 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
25570 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  **.** However, i
25580 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
25590 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
255a0 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
255b0 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
255c0 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
255d0 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
255e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
255f0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
25600 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25610 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61  nt *pnPage){.  a
25620 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25630 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
25640 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
25650 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
25660 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
25670 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50  NISHED );.  *pnP
25680 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65  age = (int)pPage
25690 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f  r->dbSize;.}.../
256a0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
256b0 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
256c0 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
256d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
256e0 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
256f0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
25700 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
25710 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
25720 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
25730 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
25740 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
25750 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
25760 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
25770 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
25780 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
25790 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
257a0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
257b0 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
257c0 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
257d0 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
257e0 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
257f0 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
25800 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
25810 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
25820 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
25830 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
25840 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
25850 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
25860 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
25870 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
25880 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
25890 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
258a0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
258b0 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
258c0 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
258d0 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
258e0 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
258f0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
25900 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
25910 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
25920 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
25930 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
25940 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25970 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  /..  /* Check th
25980 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65  at this is eithe
25990 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75  r a no-op (becau
259a0 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  se the requested
259b0 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61   lock is .  ** a
259c0 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72  lready held), or
259d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e   one of the tran
259e0 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65  sitions that the
259f0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20   busy-handler.  
25a00 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65  ** may be invoke
25a10 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64  d during, accord
25a20 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  ing to the comme
25a30 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71  nt above.  ** sq
25a40 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
25a50 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f  yhandler()..  */
25a60 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
25a70 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74  er->eLock>=lockt
25a80 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ype).       || (
25a90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
25aa0 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  O_LOCK && lockty
25ab0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
25ac0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
25ad0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  er->eLock==RESER
25ae0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  VED_LOCK && lock
25af0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
25b00 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f  LOCK).  );..  do
25b10 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65   {.    rc = page
25b20 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
25b30 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68  locktype);.  }wh
25b40 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
25b50 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
25b60 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
25b70 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
25b80 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72  rArg) );.  retur
25b90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
25ba0 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
25bb0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25bc0 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
25bd0 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
25be0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
25bf0 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
25c00 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
25c10 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
25c20 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
25c30 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
25c40 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
25c50 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
25c60 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
25c70 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
25c80 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
25c90 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
25ca0 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
25cb0 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
25cc0 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
25cd0 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
25ce0 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
25cf0 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
25d00 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
25d10 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
25d20 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
25d30 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
25d40 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
25d50 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
25d60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
25d70 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
25d80 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
25d90 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
25da0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
25db0 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
25dc0 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
25dd0 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
25de0 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
25df0 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
25e00 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
25e10 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
25e20 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
25e30 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
25e40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
25e50 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
25e60 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
25e70 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
25e80 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
25e90 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
25ea0 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74  avior would be t
25eb0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
25ec0 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74  rrent.** content
25ed0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f   of the page. Ho
25ee0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69  wever, since thi
25ef0 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
25f00 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68   present in eith
25f10 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  er.** the databa
25f20 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  se file or the p
25f30 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  ortion of the ro
25f40 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
25f50 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  nd .** sub-journ
25f60 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  al rolled back t
25f70 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64  he content could
25f80 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64   not be restored
25f90 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61   and the.** data
25fa0 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64  base image would
25fb0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
25fc0 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65   It is therefore
25fd0 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20   fortunate that 
25fe0 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73  .** this circums
25ff0 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69  tance cannot ari
26000 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  se..*/.#if defin
26010 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
26020 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
26030 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
26040 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70  raintCb(PgHdr *p
26050 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
26060 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
26070 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72  DIRTY );.  asser
26080 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  t( !subjRequires
26090 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67  Page(pPg) || pPg
260a0 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61  ->pgno<=pPg->pPa
260b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d  ger->dbSize );.}
260c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
260d0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
260e0 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  raint(Pager *pPa
260f0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
26100 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
26110 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
26120 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  e, assertTruncat
26130 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a  eConstraintCb);.
26140 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
26150 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26160 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
26170 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
26180 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
26190 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
261a0 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
261b0 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
261c0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
261d0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
261e0 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
261f0 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
26200 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
26210 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
26220 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
26230 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
26240 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
26250 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
26260 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
26270 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
26280 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
26290 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
262a0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72  is only called r
262b0 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  ight before comm
262c0 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
262d0 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68  tion..** Once th
262e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
262f0 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
26300 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
26310 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72  t either be.** r
26320 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f  olled back or co
26330 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e  mmitted. It is n
26340 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20  ot safe to call 
26350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
26360 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e  d.** then contin
26370 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ue writing to th
26380 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76  e database..*/.v
26390 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
263a0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
263b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
263c0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
263d0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
263e0 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61  ze>=nPage );.  a
263f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
26400 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
26410 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
26420 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
26430 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20   = nPage;..  /* 
26440 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65  At one point the
26450 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65   code here calle
26460 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
26470 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a  Constraint() to.
26480 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74    ** ensure that
26490 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67   all pages being
264a0 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20   truncated away 
264b0 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
264c0 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f  n are,.  ** if o
264d0 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
264e0 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20  oints are open, 
264f0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73  present in the s
26500 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a  avepoint .  ** j
26510 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74  ournal so that t
26520 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
26530 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70  red if the savep
26540 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20  oint is rolled. 
26550 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69   ** back. This i
26560 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65  s no longer nece
26570 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75  ssary as this fu
26580 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e  nction is now on
26590 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72  ly.  ** called r
265a0 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  ight before comm
265b0 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
265c0 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67  tion. So althoug
265d0 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  h the .  ** Page
265e0 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69  r object may sti
265f0 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76  ll have open sav
26600 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e  epoints (Pager.n
26610 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a  Savepoint!=0), .
26620 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74    ** they cannot
26630 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
26640 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72   So the assertTr
26650 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26660 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20  () call.  ** is 
26670 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63  no longer correc
26680 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  t. */.}.../*.** 
26690 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
266a0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61   called before a
266b0 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d  ttempting a hot-
266c0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
266d0 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68  . It.** syncs th
266e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
266f0 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74  o disk, then set
26700 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  s pPager->journa
26710 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  lHdr to the.** s
26720 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
26730 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  al file so that 
26740 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
26750 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  ck() routine kno
26760 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65  ws.** that the e
26770 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ntire journal fi
26780 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
26790 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e  ed..**.** Syncin
267a0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
267b0 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61  to disk before a
267c0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
267d0 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65  l it back ensure
267e0 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  s .** that if a 
267f0 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63  power-failure oc
26800 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
26810 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72  rollback, the pr
26820 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74  ocess that.** at
26830 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20  tempts rollback 
26840 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d  following system
26850 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74   recovery sees t
26860 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a  he same journal.
26870 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68  ** content as th
26880 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  is process..**.*
26890 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
268a0 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c  goes as planned,
268b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
268c0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
268d0 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  e, .** an SQLite
268e0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
268f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
26900 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50  SyncHotJournal(P
26910 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26920 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26930 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67  _OK;.  if( !pPag
26940 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
26950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26960 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
26970 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
26980 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RMAL);.  }.  if(
26990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
269a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
269b0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
269c0 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
269d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
269e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
269f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  .}../*.** Obtain
26a00 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26a10 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  a memory mapped 
26a20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  page object for 
26a30 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
26a40 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62  . .** The new ob
26a50 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68  ject will use th
26a60 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c  e pointer pData,
26a70 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78   obtained from x
26a80 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73  Fetch()..** If s
26a90 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
26aa0 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20  ppPage to point 
26ab0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  to the new page 
26ac0 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64  reference.** and
26ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26ae0 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  K. Otherwise, re
26af0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
26b00 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65  rror code and se
26b10 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20  t.** *ppPage to 
26b20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  zero..**.** Page
26b30 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61   references obta
26b40 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ined by calling 
26b50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
26b60 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64  ould be released
26b70 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70  .** by calling p
26b80 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
26b90 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
26ba0 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65  int pagerAcquire
26bb0 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72  MapPage(.  Pager
26bc0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
26bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
26be0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
26bf0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a  /* Page number *
26c20 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  /.  void *pData,
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27      /* xFetch()'
26c50 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  d data for this 
26c60 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
26c70 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20  **ppPage        
26c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26c90 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20  : Acquired page 
26ca0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50  object */.){.  P
26cb0 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26cd0 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  * Memory mapped 
26ce0 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  page to return *
26cf0 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67 65  /.  .  if( pPage
26d00 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26d10 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
26d20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  = p = pPager->pM
26d30 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20  mapFreelist;.   
26d40 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26d50 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72  eelist = p->pDir
26d60 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
26d70 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65  y = 0;.    memse
26d80 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  t(p->pExtra, 0, 
26d90 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
26da0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
26db0 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
26dc0 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
26dd0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
26de0 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
26df0 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
26e00 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
26e10 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
26e20 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
26e30 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
26e40 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
26e50 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
26e60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
26e70 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
26e80 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
26e90 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
26ea0 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
26eb0 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26ec0 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
26ed0 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
26ee0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
26ef0 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
26f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26f10 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
26f20 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
26f30 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
26f40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
26f50 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
26f60 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
26f70 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
26f80 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
26f90 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
26fa0 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
26fb0 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
26fc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26fd0 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
26fe0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
26ff0 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
27000 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
27010 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
27020 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
27030 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
27040 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
27050 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
27060 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
27070 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
27080 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
27090 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
270a0 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
270b0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  y = pPager->pMma
270c0 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61  pFreelist;.  pPa
270d0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
270e0 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  st = pPg;..  ass
270f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
27100 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
27110 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
27120 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
27130 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
27140 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
27150 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
27160 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
27170 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
27180 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
27190 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
271a0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73  MmapFreelist lis
271b0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
271c0 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64  d pagerFreeMapHd
271d0 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  rs(Pager *pPager
271e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
271f0 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
27200 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
27210 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b  MmapFreelist; p;
27220 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
27230 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
27240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27250 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
27260 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
27270 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
27280 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
27290 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
272a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
272b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
272c0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
272d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
272e0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
272f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
27300 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
27310 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
27320 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
27330 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
27340 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
27350 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
27360 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
27370 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
27380 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
27390 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
273a0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
273b0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
273c0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
273d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
273e0 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
273f0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
27400 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
27410 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
27420 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
27430 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
27440 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
27450 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
27460 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
27470 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
27480 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
27490 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
274a0 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
274b0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
274c0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
274d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
274e0 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
274f0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
27500 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
27510 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
27520 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
27530 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
27540 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
27550 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
27560 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
27570 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
27580 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
27590 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
275a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
275b0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
275c0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
275d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
275e0 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
275f0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
27600 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
27610 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
27620 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
27630 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
27640 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
27650 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
27660 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
27670 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
27680 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
27690 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
276a0 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
276b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
276c0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
276d0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
276e0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
276f0 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
27700 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
27710 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
27720 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
27730 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
27740 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
27750 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
27760 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
27770 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
27780 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
27790 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
277a0 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
277b0 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
277c0 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
277d0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
277e0 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
277f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
27800 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
27810 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
27820 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
27830 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
27840 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
27850 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
27860 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
27870 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27880 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
27890 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
278a0 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
278b0 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
278c0 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
278d0 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
278e0 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
278f0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
27900 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
27910 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27920 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27930 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27940 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
27950 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
27960 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
27970 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
27980 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
27990 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
279a0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
279b0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
279c0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
279d0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
279e0 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
279f0 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
27a00 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
27a10 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
27a20 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
27a30 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
27a40 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
27a50 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
27a60 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
27a70 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
27a80 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
27a90 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27aa0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
27ab0 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
27ac0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
27ad0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
27ae0 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
27af0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
27b00 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
27b10 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27b20 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
27b30 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
27b40 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
27b50 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
27b60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27b70 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
27b80 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
27b90 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
27ba0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
27bb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
27bc0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
27bd0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
27be0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
27bf0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
27c00 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
27c10 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
27c20 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
27c30 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
27c40 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
27c50 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
27c60 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
27c70 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
27c80 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
27c90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
27ca0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
27cb0 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
27cc0 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
27cd0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
27ce0 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
27cf0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
27d00 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
27d10 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
27d20 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
27d30 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
27d40 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
27d50 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
27d60 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
27d70 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
27d80 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
27d90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
27da0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
27db0 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
27dc0 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
27dd0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27de0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27df0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
27e00 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
27e10 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
27e20 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
27e30 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
27e40 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
27e50 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
27e60 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
27e70 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
27e80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27e90 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
27ea0 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
27eb0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
27ec0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
27ed0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
27ee0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
27ef0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27f00 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
27f10 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
27f20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
27f30 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
27f40 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
27f50 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
27f60 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
27f70 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
27f80 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
27f90 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
27fa0 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
27fb0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
27fc0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
27fd0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
27fe0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
27ff0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
28000 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28010 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
28020 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
28030 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
28040 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
28050 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
28060 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
28070 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
28080 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
28090 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
280a0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
280b0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
280c0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
280d0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
280e0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
280f0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
28100 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
28110 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
28120 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
28130 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
28140 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
28150 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
28160 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
28170 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
28180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
28190 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
281a0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
281b0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
281c0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
281d0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
281e0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
281f0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
28200 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
28210 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
28220 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
28230 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
28240 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
28250 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
28260 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
28270 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
28280 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
28290 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
282a0 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
282b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
282c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
282d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
282e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
282f0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28300 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
28310 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
28320 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28330 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
28340 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
28350 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
28360 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
28370 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
28380 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
28390 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
283a0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
283b0 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ger, 0);.  if( r
283c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
283d0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
283e0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
283f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28400 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
28410 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
28420 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28430 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
28440 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
28450 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
28460 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
28470 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
28480 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
28490 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
284a0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
284b0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
284c0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
284d0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
284e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
284f0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
28500 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
28510 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
28520 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
28530 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
28540 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
28550 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
28560 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
28570 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
28580 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
28590 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
285a0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
285b0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
285c0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
285d0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
285e0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
285f0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
28600 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
28610 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
28620 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
28630 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
28640 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
28650 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
28660 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
28670 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
28680 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
28690 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
286a0 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
286b0 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
286c0 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
286d0 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
286e0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
286f0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
28700 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
28710 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
28720 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
28730 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
28740 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
28750 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
28760 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
28770 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
28780 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
28790 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
287a0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
287b0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
287c0 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
287d0 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
287e0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
287f0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
28800 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
28810 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
28820 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
28830 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
28840 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
28850 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
28860 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
28870 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28880 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
28890 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
288a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
288b0 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
288c0 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
288d0 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
288e0 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
288f0 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
28900 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
28910 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
28920 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
28930 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
28940 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
28950 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
28960 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
28970 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
28980 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
28990 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
289a0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
289b0 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
289c0 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
289d0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
289e0 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
289f0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
28a00 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
28a10 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
28a20 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
28a30 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
28a40 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
28a50 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
28a60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28a70 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
28a80 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
28a90 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
28aa0 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
28ab0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
28ac0 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
28ad0 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
28ae0 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
28af0 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
28b00 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
28b10 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
28b20 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
28b30 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
28b40 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
28b50 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
28b60 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
28b70 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
28b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28b90 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
28ba0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
28bb0 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
28bc0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
28bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28be0 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
28bf0 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
28c00 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
28c10 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
28c20 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
28c30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28c40 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
28c50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
28c60 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
28c70 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
28c80 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28c90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
28ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
28cb0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
28cc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
28cd0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
28ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
28cf0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
28d00 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
28d10 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
28d20 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
28d30 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
28d40 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
28d50 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
28d60 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
28d70 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
28d80 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
28d90 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
28da0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
28db0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
28dc0 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
28dd0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
28de0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
28df0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
28e00 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
28e10 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
28e20 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
28e30 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
28e40 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
28e50 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
28e60 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
28e70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
28e80 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
28e90 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
28ea0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
28eb0 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
28ec0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
28ed0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
28ee0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
28ef0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
28f00 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
28f10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
28f20 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
28f30 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
28f40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
28f50 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
28f60 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
28f70 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
28f80 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
28f90 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28fa0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28fb0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28fc0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
28fd0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28fe0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
28ff0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
29000 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
29010 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
29020 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
29030 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
29040 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29050 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
29070 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
29080 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
29090 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
290a0 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
290b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
290c0 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
290d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
290e0 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
290f0 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
29100 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
29110 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
29120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29130 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29140 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
29150 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29160 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
29170 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
29180 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
29190 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
291a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
291b0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
291c0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
291d0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
291e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
291f0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
29200 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
29210 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
29220 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
29230 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
29240 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
29250 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
29260 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
29270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29280 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
29290 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
292a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
292b0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
292c0 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
292d0 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
292e0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
292f0 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
29300 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
29310 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
29320 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
29330 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
29340 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29350 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29360 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29380 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
29390 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
293a0 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
293b0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
293c0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
293d0 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
293e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
293f0 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
29400 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
29410 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
29420 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
29430 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
29440 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
29450 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
29460 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
29470 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
29480 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
29490 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
294a0 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
294b0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
294c0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
294d0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
294e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
294f0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
29500 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
29510 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
29520 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
29530 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
29540 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
29550 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
29560 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
29570 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
29580 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
29590 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
295a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
295b0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
295c0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
295d0 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
295e0 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
295f0 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
29600 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
29610 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
29620 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
29630 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
29640 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
29650 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
29660 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
29670 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
29680 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29690 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
296a0 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
296b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
296c0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
296d0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
296e0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
296f0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
29700 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
29710 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
29720 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
29730 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
29740 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
29750 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
29760 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
29770 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
29780 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
29790 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
297a0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
297b0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
297c0 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
297d0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
297e0 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
297f0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
29800 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
29810 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
29820 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
29830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29840 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
29850 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
29860 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
29870 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
29880 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
29890 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
298a0 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
298b0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
298c0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
298d0 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
298e0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
298f0 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
29900 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
29910 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
29920 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
29930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29940 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
29950 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
29960 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
29970 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
29980 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
29990 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
299a0 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
299b0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
299c0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
299d0 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
299e0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
299f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29a00 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
29a10 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
29a20 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
29a30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
29a40 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
29a50 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
29a60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29a70 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
29a80 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
29a90 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
29aa0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
29ab0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29ac0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
29ad0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
29ae0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
29af0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
29b00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29b10 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
29b20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29b30 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
29b40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
29b50 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
29b60 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
29b70 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
29b80 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
29b90 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
29ba0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
29bb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
29bc0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
29bd0 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
29be0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
29bf0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
29c00 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
29c10 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
29c20 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
29c30 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
29c40 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
29c50 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
29c60 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
29c70 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
29c80 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
29c90 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
29ca0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
29cb0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
29cc0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
29cd0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
29ce0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
29cf0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
29d00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
29d10 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
29d20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
29d30 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
29d40 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
29d50 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
29d60 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
29d70 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
29d80 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
29d90 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
29da0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
29db0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
29dc0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
29dd0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
29de0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
29df0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
29e00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29e10 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  OK .   && pPager
29e20 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61  ->dbHintSize<pPa
29e30 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26  ger->dbSize.   &
29e40 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  & (pList->pDirty
29e50 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e   || pList->pgno>
29e60 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
29e70 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ze).  ){.    sql
29e80 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
29e90 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
29ea0 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
29eb0 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
29ec0 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
29ed0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
29ee0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
29ef0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
29f00 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
29f10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
29f20 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
29f30 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
29f40 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
29f50 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
29f60 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
29f70 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
29f80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
29f90 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
29fa0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
29fb0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
29fc0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
29fd0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
29fe0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
29ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
2a000 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
2a010 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
2a020 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
2a030 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
2a040 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
2a050 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
2a060 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
2a070 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
2a080 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
2a090 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
2a0a0 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
2a0b0 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
2a0c0 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
2a0d0 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
2a0e0 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
2a0f0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2a100 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
2a110 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
2a120 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
2a130 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
2a140 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2a150 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
2a160 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
2a170 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
2a180 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
2a190 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
2a1a0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2a1b0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
2a1e0 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
2a1f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
2a200 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
2a210 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2a220 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2a230 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
2a240 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
2a250 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20  unter(pList);.. 
2a260 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
2a270 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2a280 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2a290 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
2a2a0 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
2a2b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
2a2c0 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
2a2d0 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
2a2e0 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
2a2f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a300 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a310 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
2a320 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2a330 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
2a340 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
2a350 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
2a360 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
2a370 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
2a380 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
2a390 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
2a3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a3b0 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
2a3c0 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
2a3d0 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
2a3e0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2a3f0 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
2a400 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
2a410 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
2a420 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2a430 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
2a440 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
2a450 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
2a460 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
2a470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a480 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
2a490 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2a4a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2a4b0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
2a4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2a4d0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
2a4e0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
2a4f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
2a500 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
2a510 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
2a520 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a530 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
2a540 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2a550 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
2a560 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
2a570 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
2a580 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
2a590 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
2a5a0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
2a5b0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
2a5c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2a5d0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
2a5e0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2a5f0 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
2a600 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
2a610 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2a620 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
2a630 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
2a640 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
2a650 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  count);.    }els
2a660 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
2a670 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
2a680 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2a690 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2a6a0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
2a6b0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
2a6c0 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
2a6d0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
2a6e0 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
2a6f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a700 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
2a710 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2a720 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
2a730 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2a740 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
2a750 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2a760 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2a770 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
2a780 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
2a790 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
2a7a0 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
2a7b0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
2a7c0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2a7d0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
2a7e0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
2a7f0 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
2a800 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
2a810 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2a820 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2a830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2a840 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2a850 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
2a860 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2a870 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2a880 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2a890 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
2a8a0 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
2a8b0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
2a8c0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
2a8d0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
2a8e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2a8f0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
2a900 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
2a910 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
2a920 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
2a930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
2a950 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
2a960 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
2a970 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
2a980 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
2a990 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2a9a0 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
2a9b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2a9c0 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
2a9d0 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
2a9e0 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
2a9f0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
2aa00 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
2aa10 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2aa20 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
2aa30 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2aa40 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
2aa50 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
2aa60 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2aa70 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
2aa80 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
2aa90 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
2aaa0 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
2aab0 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
2aac0 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
2aad0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
2aae0 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
2aaf0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
2ab00 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2ab10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ab20 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
2ab30 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2ab40 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
2ab50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2ab60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ab70 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
2ab80 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
2ab90 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
2aba0 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
2abb0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
2abc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2abd0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2abe0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2abf0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
2ac00 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2ac10 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
2ac20 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2ac30 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
2ac40 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
2ac50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
2ac60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2ac70 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
2ac80 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67  geInJournal(pPag
2ac90 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20  er, pPg) .      
2aca0 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
2acb0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2acc0 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
2acd0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2ace0 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
2acf0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
2ad00 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
2ad10 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
2ad20 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
2ad30 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
2ad40 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
2ad50 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
2ad60 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
2ad70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ad80 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
2ad90 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2ada0 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
2adb0 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  et = (i64)pPager
2adc0 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
2add0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2ade0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2adf0 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44  a2;.  .      COD
2ae00 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
2ae10 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
2ae20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ae30 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
2ae40 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2ae50 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
2ae60 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2ae70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2ae80 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2ae90 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
2aea0 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  ts(pPager->sjfd,
2aeb0 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
2aec0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2aed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2aee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2aef0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2af00 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
2af10 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2af20 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
2af30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2af40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2af50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
2af60 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20  er->nSubRec++;. 
2af70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2af80 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
2af90 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54  );.    rc = addT
2afa0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2afb0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
2afc0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2afd0 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
2afe0 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
2aff0 67 65 49 66 52 65 71 75 69 72 65 64 28 50 67 48  geIfRequired(PgH
2b000 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
2b010 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2b020 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65 74  (pPg) ){.    ret
2b030 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  urn subjournalPa
2b040 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
2b050 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b060 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
2b070 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2b080 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2b090 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
2b0a0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
2b0b0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
2b0c0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
2b0d0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
2b0e0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
2b0f0 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
2b100 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
2b110 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
2b120 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
2b130 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
2b140 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
2b150 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
2b160 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
2b170 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
2b180 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
2b190 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
2b1a0 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
2b1b0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2b1c0 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
2b1d0 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
2b1e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
2b1f0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
2b200 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
2b210 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
2b220 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
2b230 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
2b240 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
2b250 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
2b260 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
2b270 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2b280 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
2b290 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
2b2a0 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
2b2b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
2b2c0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
2b2d0 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
2b2e0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2b2f0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
2b300 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
2b310 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2b320 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2b330 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2b340 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
2b350 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
2b360 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
2b370 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2b380 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
2b390 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
2b3a0 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
2b3b0 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
2b3c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2b3d0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
2b3e0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
2b3f0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2b400 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
2b410 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
2b420 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
2b430 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
2b440 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2b450 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
2b460 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
2b470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2b480 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
2b490 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
2b4a0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
2b4b0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
2b4c0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
2b4d0 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74  Spill NOSYNC bit
2b4e0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74   is set during t
2b4f0 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20  imes when doing 
2b500 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a  a sync of.  ** j
2b510 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69  ournal (and addi
2b520 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29  ng a new header)
2b530 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e   is not allowed.
2b540 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20    This occurs.  
2b550 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20  ** during calls 
2b560 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
2b570 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79  rite() while try
2b580 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d  ing to journal m
2b590 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67  ultiple.  ** pag
2b5a0 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  es belonging to 
2b5b0 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e  the same sector.
2b5c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
2b5d0 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41  oNotSpill ROLLBA
2b5e0 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20  CK and OFF bits 
2b5f0 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
2b600 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a  he spilling.  **
2b610 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2b620 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2b630 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
2b640 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64  .  This is set d
2b650 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c  uring.  ** a rol
2b660 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72  lback or by user
2b670 20 72 65 71 75 65 73 74 2c 20 72 65 73 70 65 63   request, respec
2b680 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  tively..  **.  *
2b690 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c  * Spilling is al
2b6a0 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68  so prohibited wh
2b6b0 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  en in an error s
2b6c0 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20  tate since that 
2b6d0 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20  could.  ** lead 
2b6e0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
2b6f0 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65  uption.   In the
2b700 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
2b710 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a  ntation it .  **
2b720 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2b730 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  or sqlite3Pcache
2b740 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61  Fetch() to be ca
2b750 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65  lled with create
2b760 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69  Flag==3.  ** whi
2b770 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  le in the error 
2b780 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20  state, hence it 
2b790 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
2b7a0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
2b7b0 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  o.  ** be called
2b7c0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2b7d0 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ate.  Neverthele
2b7e0 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61  ss, we include a
2b7f0 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65   NEVER().  ** te
2b800 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72  st for the error
2b810 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65   state as a safe
2b820 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75  guard against fu
2b830 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20  ture changes..  
2b840 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2b850 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2b860 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b870 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  OK;.  testcase( 
2b880 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b890 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
2b8a0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73  OLLBACK );.  tes
2b8b0 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2b8c0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2b8d0 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74  LFLAG_OFF );.  t
2b8e0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b8f0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b900 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29  ILLFLAG_NOSYNC )
2b910 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2b920 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26  doNotSpill.   &&
2b930 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74   ((pPager->doNot
2b940 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c  Spill & (SPILLFL
2b950 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c  AG_ROLLBACK|SPIL
2b960 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20  LFLAG_OFF))!=0. 
2b970 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c       || (pPg->fl
2b980 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
2b990 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a  _SYNC)!=0).  ){.
2b9a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b9b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
2b9c0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
2b9d0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
2b9e0 70 50 61 67 65 72 29 20 29 7b 0a 23 69 66 6e 64  pPager) ){.#ifnd
2b9f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
2ba00 4f 4e 43 55 52 52 45 4e 54 0a 20 20 20 20 2f 2a  ONCURRENT.    /*
2ba10 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
2ba20 69 6f 6e 20 69 73 20 61 20 22 42 45 47 49 4e 20  ion is a "BEGIN 
2ba30 43 4f 4e 43 55 52 52 45 4e 54 22 20 74 72 61 6e  CONCURRENT" tran
2ba40 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67  saction, the pag
2ba50 65 20 0a 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74  e .    ** cannot
2ba60 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
2ba70 69 73 6b 2e 20 52 65 74 75 72 6e 20 65 61 72 6c  isk. Return earl
2ba80 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  y in this case. 
2ba90 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2baa0 72 2d 3e 70 41 6c 6c 52 65 61 64 20 29 20 72 65  r->pAllRead ) re
2bab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bac0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
2bad0 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
2bae0 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
2baf0 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
2bb00 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
2bb10 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2bb20 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66  ed(pPg); .    if
2bb30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bb40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2bb50 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
2bb60 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
2bb70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2bb80 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
2bb90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bba0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2bbb0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
2bbc0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2bbd0 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
2bbe0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2bbf0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
2bc00 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
2bc10 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
2bc20 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2bc30 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
2bc40 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2bc50 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
2bc60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2bc70 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
2bc80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bc90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2bca0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2bcb0 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2bcc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2bcd0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2bce0 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  t(pPager, pPg);.
2bcf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2bd00 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
2bd10 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
2bd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bd30 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
2bd40 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
2bd50 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2bd60 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2bd70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
2bd80 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2bd90 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
2bda0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2bdb0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a  r(pPager, rc); .
2bdc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
2bdd0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
2bde0 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
2bdf0 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
2be00 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
2be10 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
2be20 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
2be30 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
2be40 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
2be50 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2be60 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
2be70 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
2be80 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
2be90 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
2bea0 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2beb0 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
2bec0 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
2bed0 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
2bee0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2bef0 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
2bf00 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
2bf10 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
2bf20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
2bf30 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
2bf40 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2bf50 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
2bf60 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
2bf70 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
2bf80 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
2bf90 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
2bfa0 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
2bfb0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2bfc0 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
2bfd0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
2bfe0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
2bff0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2c000 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
2c010 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
2c020 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
2c030 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
2c040 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
2c050 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
2c060 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2c070 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
2c080 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
2c090 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
2c0a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
2c0b0 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a  xtra() API..**.*
2c0c0 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
2c0d0 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
2c0e0 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
2c0f0 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
2c100 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
2c110 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
2c120 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
2c130 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
2c140 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
2c150 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61   the PAGER_* fla
2c160 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2c170 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2c180 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2c190 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2c1a0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2c1b0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2c1c0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2c1d0 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2c1e0 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2c1f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2c200 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2c210 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2c220 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2c230 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2c240 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2c250 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2c260 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2c270 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2c280 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2c290 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2c2a0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2c2b0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2c2c0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2c2d0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2c2e0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2c2f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2c300 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2c310 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2c320 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2c330 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2c340 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2c350 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2c360 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2c370 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2c380 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2c390 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2c3a0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2c3b0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2c3c0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2c3d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2c3e0 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2c3f0 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2c400 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c410 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2c420 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2c430 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2c440 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2c450 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2c460 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2c470 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2c480 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2c490 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c4b0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2c4c0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2c4d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2c4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2c4f0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2c500 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2c510 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2c520 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2c530 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2c540 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2c550 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2c560 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2c570 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2c580 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2c590 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2c5a0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2c5b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c5c0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2c5d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2c5e0 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2c5f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2c600 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2c610 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2c620 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2c630 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2c640 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2c650 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2c660 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2c670 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2c680 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2c690 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2c6a0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2c6b0 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2c6c0 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2c6d0 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2c6e0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2c6f0 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2c700 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2c710 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2c720 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2c730 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2c740 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2c750 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2c760 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2c770 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2c780 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2c790 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2c7a0 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2c7b0 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2c7c0 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
2c7d0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
2c7e0 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
2c7f0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2c800 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
2c810 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
2c820 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
2c830 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
2c840 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
2c850 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  size */.  const 
2c860 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20  char *zUri = 0; 
2c870 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74     /* URI args t
2c880 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
2c890 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20  nUri = 0;       
2c8a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c8b0 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61  f bytes of URI a
2c8c0 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a  rgs at *zUri */.
2c8d0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
2c8e0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
2c8f0 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
2c900 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
2c910 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
2c920 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
2c930 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
2c940 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
2c950 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
2c960 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
2c970 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
2c980 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
2c990 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2c9a0 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
2c9b0 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
2c9c0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2c9d0 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
2c9e0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
2c9f0 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
2ca00 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
2ca10 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
2ca20 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
2ca30 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
2ca40 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
2ca50 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
2ca60 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
2ca70 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2ca80 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
2ca90 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
2caa0 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
2cab0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2cac0 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
2cad0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
2cae0 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
2caf0 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
2cb00 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2cb10 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
2cb20 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
2cb30 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2cb40 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
2cb50 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
2cb60 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
2cb70 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
2cb80 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
2cb90 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
2cba0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
2cbb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2cbc0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
2cbd0 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
2cbe0 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
2cbf0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
2cc00 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2cc10 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2cc20 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
2cc30 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2cc40 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  up(0, zFilename)
2cc50 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
2cc60 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75  hname==0  ) retu
2cc70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2cc80 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  .      nPathname
2cc90 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2cca0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2ccb0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d       zFilename =
2ccc0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
2ccd0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ndif..  /* Compu
2cce0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
2ccf0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
2cd00 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
2cd10 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
2cd20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
2cd30 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
2cd40 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
2cd50 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
2cd60 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
2cd70 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
2cd80 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
2cd90 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
2cda0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2cdb0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2cdc0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2cdd0 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  *z;.    nPathnam
2cde0 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
2cdf0 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
2ce00 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2ce10 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50  bMallocRaw(0, nP
2ce20 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2ce30 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2ce40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ce50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2ce60 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2ce70 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2ce80 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2ce90 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2cea0 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2ceb0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2cec0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2ced0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2cee0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2cef0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2cf00 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2cf10 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2cf20 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2cf30 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2cf40 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2cf50 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2cf60 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2cf70 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2cf80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2cf90 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2cfa0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2cfb0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2cfc0 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20  i = (int)(&z[1] 
2cfd0 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73  - zUri);.    ass
2cfe0 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a  ert( nUri>=0 );.
2cff0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d000 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2d010 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2d020 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2d030 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2d040 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2d050 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2d060 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2d070 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2d080 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2d090 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2d0a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2d0b0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2d0c0 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2d0d0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2d0e0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2d0f0 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2d100 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2d110 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2d120 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d130 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2d140 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2d150 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2d160 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2d170 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2d180 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2d190 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2d1a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d1b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2d1c0 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d1d0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2d1e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2d1f0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2d200 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2d210 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2d220 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2d230 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2d240 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2d250 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d260 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2d270 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2d280 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2d290 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2d2a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2d2b0 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2d2c0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2d2d0 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2d2e0 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2d2f0 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2d300 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2d310 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2d320 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2d330 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2d340 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2d350 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2d360 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2d370 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2d380 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2d390 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2d3a0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2d3b0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2d3c0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2d3d0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2d3e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2d3f0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2d400 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2d410 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2d420 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2d430 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2d440 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2d450 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2d460 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2d470 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2d480 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2d490 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2d4a0 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2d4b0 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2d4c0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2d4d0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2d4e0 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2d4f0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2d500 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2d510 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2d520 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2d530 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2d540 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2d550 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2d560 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2d570 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2d580 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2d590 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2d5a0 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2d5b0 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2d5c0 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20  ame + 8 + 2     
2d5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2d5e0 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2d5f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2d600 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2d610 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 4 + 2         
2d620 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2d630 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2d640 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2d650 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2d660 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2d670 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2d680 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2d690 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d6a0 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2d6b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d6c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
2d6d0 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
2d6e0 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
2d6f0 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
2d700 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
2d710 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
2d720 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2d730 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
2d740 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
2d750 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2d760 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2d770 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
2d780 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
2d790 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2d7a0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2d7b0 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
2d7c0 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
2d7d0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2d7e0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d7f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
2d800 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
2d810 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
2d820 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2d830 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2d840 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
2d850 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
2d860 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
2d870 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
2d880 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
2d890 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
2d8a0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
2d8b0 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
2d8c0 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e    assert( nPathn
2d8d0 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61  ame>0 );.    pPa
2d8e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
2d8f0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2d900 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20  = nPathname + 1 
2d910 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  + nUri);.    mem
2d920 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
2d930 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
2d940 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d950 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d    if( nUri ) mem
2d960 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69  cpy(&pPager->zFi
2d970 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
2d980 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  +1], zUri, nUri)
2d990 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2d9a0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
2d9b0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2d9c0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2d9d0 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
2d9e0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2d9f0 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38  -journal\000", 8
2da00 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
2da10 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2da20 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2da30 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
2da40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2da50 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50  _OMIT_WAL.    pP
2da60 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50  ager->zWal = &pP
2da70 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
2da80 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20  Pathname+8+1];. 
2da90 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2daa0 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ->zWal, zPathnam
2dab0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2dac0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2dad0 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d  r->zWal[nPathnam
2dae0 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20  e], "-wal\000", 
2daf0 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+1);.    sqlite
2db00 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2db10 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2db20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23  pPager->zWal);.#
2db30 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
2db40 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2db50 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
2db60 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
2db70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
2db80 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
2db90 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2dba0 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
2dbb0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2dbc0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2dbd0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74   ){.    int fout
2dbe0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2dbf0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
2dc00 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
2dc10 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20  y xOpen() */.   
2dc20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2dc30 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2dc40 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2dc50 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67  ger->fd, vfsFlag
2dc60 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61  s, &fout);.    a
2dc70 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b  ssert( !memDb );
2dc80 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2dc90 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
2dca0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
2dcb0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2dcc0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2dcd0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
2dce0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
2dcf0 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
2dd00 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2dd10 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
2dd20 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
2dd30 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2dd40 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
2dd50 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
2dd60 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
2dd70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2dd80 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
2dd90 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
2dda0 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
2ddb0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
2ddc0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
2ddd0 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
2dde0 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
2ddf0 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
2de00 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
2de10 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
2de20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2de30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
2de40 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
2de50 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2de60 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
2de70 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61  ;.      if( !rea
2de80 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
2de90 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2dea0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2deb0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2dec0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2ded0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2dee0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2def0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61          if( szPa
2df00 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73  geDflt<pPager->s
2df10 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
2df20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2df30 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51  r->sectorSize>SQ
2df40 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2df50 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
2df60 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2df70 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
2df80 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2df90 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  IZE;.          }
2dfa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2dfb0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
2dfc0 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u32)pPager->sect
2dfd0 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
2dfe0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69    }.        }.#i
2dff0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2e000 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2e010 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2e020 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2e030 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2e040 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2e050 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
2e060 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e070 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2e080 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
2e090 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2e0a0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
2e0b0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2e0c0 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
2e0d0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
2e0e0 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
2e0f0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e100 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
2e110 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
2e120 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
2e130 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
2e140 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
2e150 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2e160 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2e170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e180 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
2e190 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
2e1a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
2e1b0 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  k = sqlite3_uri_
2e1c0 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2e1d0 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b  e, "nolock", 0);
2e1e0 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20  .      if( (iDc 
2e1f0 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49  & SQLITE_IOCAP_I
2e200 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20  MMUTABLE)!=0.   
2e210 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75      || sqlite3_u
2e220 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2e230 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65  name, "immutable
2e240 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
2e250 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53     vfsFlags |= S
2e260 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2e270 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67  NLY;.          g
2e280 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  oto act_like_tem
2e290 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  p_file;.      }.
2e2a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2e2b0 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
2e2c0 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
2e2d0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
2e2e0 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
2e2f0 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
2e300 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
2e310 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
2e320 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
2e330 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
2e340 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
2e350 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
2e360 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
2e370 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  rite()..    **. 
2e380 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2e390 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f  h is also run fo
2e3a0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
2e3b0 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d  atabase. An in-m
2e3c0 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74  emory.    ** dat
2e3d0 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d  abase is the sam
2e3e0 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e as a temp-file
2e3f0 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77   that is never w
2e400 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20  ritten out to.  
2e410 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73    ** disk and us
2e420 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  es an in-memory 
2e430 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2e440 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2e450 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f  This branch also
2e460 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20   runs for files 
2e470 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61  marked as immuta
2e480 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74  ble..    */ .act
2e490 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a  _like_temp_file:
2e4a0 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
2e4b0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
2e4c0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
2e4d0 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65  ADER;     /* Pre
2e4e0 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20  tend we already 
2e4f0 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  have a lock */. 
2e500 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
2e510 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
2e520 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  K;    /* Pretend
2e530 20 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55   we are in EXCLU
2e540 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  SIVE mode */.   
2e550 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2e560 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2e570 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63      /* Do no loc
2e580 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64  king */.    read
2e590 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
2e5a0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2e5b0 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
2e5c0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2e5d0 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
2e5e0 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
2e5f0 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
2e600 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
2e610 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
2e620 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
2e630 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
2e640 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
2e650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e660 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e670 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
2e680 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e690 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
2e6a0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
2e6b0 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
2e6c0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
2e6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
2e6e0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2e6f0 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
2e700 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ect. */.  if( rc
2e710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e720 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
2e730 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45  a<1000 );.    nE
2e740 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2e750 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20  xtra);.    rc = 
2e760 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2e770 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2e780 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7a0 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2e7b0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2e7c0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2e7d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
2e7e0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
2e7f0 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  or occurred abov
2e800 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67  e, free the  Pag
2e810 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2e820 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2e830 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2e840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e850 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2e860 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2e870 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
2e880 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
2e890 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
2e8a0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2e8b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e8c0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2e8d0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
2e8e0 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
2e8f0 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
2e900 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
2e910 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
2e920 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
2e930 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
2e940 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
2e950 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
2e960 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
2e970 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e980 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
2e990 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
2e9a0 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
2e9b0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
2e9c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e9d0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
2e9e0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e9f0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
2ea00 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ea10 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
2ea20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
2ea30 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
2ea40 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
2ea50 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2ea60 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
2ea70 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2ea80 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2ea90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2eaa0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2eab0 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2eac0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2ead0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2eae0 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2eaf0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2eb00 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2eb10 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2eb20 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2eb30 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2eb40 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2eb50 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2eb60 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2eb70 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2eb80 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2eb90 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2eba0 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2ebb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2ebc0 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2ebd0 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2ebe0 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2ebf0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2ec00 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2ec10 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2ec20 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
2ec30 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2ec40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ec50 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
2ec60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ec70 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2ec80 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ec90 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2eca0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2ecb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ecc0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30  ckptSyncFlags==0
2ecd0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2ece0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2ecf0 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
2ed00 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
2ed10 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2ed20 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  L;.    pPager->w
2ed30 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  alSyncFlags = SQ
2ed40 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2ed50 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e   | WAL_SYNC_TRAN
2ed60 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50  SACTIONS;.    pP
2ed70 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2ed80 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2ed90 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
2eda0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2edb0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2edc0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2edd0 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2ede0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2edf0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2ee00 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2ee10 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2ee20 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2ee30 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2ee40 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2ee50 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2ee60 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ee70 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2ee80 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2ee90 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2eea0 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2eeb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2eec0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2eed0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2eee0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
2eef0 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
2ef00 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2ef10 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2ef20 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
2ef30 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
2ef40 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
2ef50 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
2ef60 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
2ef70 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2ef80 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
2ef90 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
2efa0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2efb0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2efc0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
2efd0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  /* pPager->szMma
2efe0 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  p = SQLITE_DEFAU
2eff0 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20  LT_MMAP_SIZE // 
2f000 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62  will be set by b
2f010 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70  tree.c */..  *pp
2f020 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
2f030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f040 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66  OK;.}.../* Verif
2f050 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
2f060 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ase file has not
2f070 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72   be deleted or r
2f080 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a  enamed out from.
2f090 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61 67  ** under the pag
2f0a0 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
2f0b0 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74  TE_OK if the dat
2f0c0 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  abase is still w
2f0d0 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20  ere it ought.** 
2f0e0 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20  to be on disk.  
2f0f0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
2f100 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  (SQLITE_READONLY
2f110 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65  _DBMOVED or some
2f120 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
2f130 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
2f140 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66 20  3OsAccess()) if 
2f150 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
2f160 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a   gone missing..*
2f170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74  /.static int dat
2f180 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50  abaseIsUnmoved(P
2f190 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2f1a0 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d   int bHasMoved =
2f1b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
2f1c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
2f1d0 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  pFile ) return S
2f1e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2f1f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
2f200 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2f210 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
2f220 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2f230 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69  e && pPager->zFi
2f240 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72  lename[0] );.  r
2f250 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
2f260 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
2f270 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
2f280 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48  L_HAS_MOVED, &bH
2f290 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20  asMoved);.  if( 
2f2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
2f2b0 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  UND ){.    /* If
2f2c0 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66   the HAS_MOVED f
2f2d0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75  ile-control is u
2f2e0 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73  nimplemented, as
2f2f0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
2f300 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  le.    ** has no
2f310 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54  t been moved.  T
2f320 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74 6f  hat is the histo
2f330 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f  rical behavior o
2f340 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20  f SQLite: prior 
2f350 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  to.    ** versio
2f360 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65  n 3.8.3, it neve
2f370 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20  r checked */.   
2f380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f390 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2f3a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48  =SQLITE_OK && bH
2f3b0 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72  asMoved ){.    r
2f3c0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
2f3d0 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d  NLY_DBMOVED;.  }
2f3e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f3f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2f400 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2f410 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
2f420 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
2f430 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
2f440 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
2f450 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
2f460 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
2f470 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
2f480 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2f490 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
2f4a0 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
2f4b0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
2f4c0 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
2f4d0 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
2f4e0 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
2f4f0 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
2f500 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
2f510 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
2f520 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
2f530 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
2f540 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2f550 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
2f560 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
2f570 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
2f580 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2f590 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2f5a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2f5b0 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
2f5c0 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
2f5d0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
2f5e0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2f5f0 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
2f600 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2f610 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
2f620 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2f630 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
2f640 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
2f650 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2f660 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f670 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
2f680 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2f690 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
2f6a0 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
2f6b0 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
2f6c0 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
2f6d0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
2f6e0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
2f6f0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2f700 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f710 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
2f720 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
2f730 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2f740 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2f750 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2f760 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
2f770 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
2f780 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
2f790 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
2f7a0 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
2f7b0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2f7c0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2f7d0 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
2f7e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2f7f0 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
2f800 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
2f810 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
2f820 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
2f830 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
2f840 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
2f850 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
2f860 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
2f870 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
2f880 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
2f890 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
2f8a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2f8b0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
2f8c0 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
2f8d0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
2f8e0 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
2f8f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
2f900 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
2f910 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2f920 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
2f930 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2f940 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
2f950 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
2f960 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
2f970 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2f980 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2f990 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2f9a0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2f9b0 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
2f9c0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
2f9d0 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
2f9e0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
2f9f0 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
2fa00 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2fa10 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
2fa20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
2fa30 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2fa40 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
2fa50 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2fa60 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
2fa70 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2fa80 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2fa90 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
2faa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2fab0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
2fac0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2fad0 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2faf0 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
2fb00 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2fb10 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
2fb20 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
2fb30 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
2fb40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fb50 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2fb60 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2fb70 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2fb80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fb90 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2fba0 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  PEN );..  assert
2fbb0 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ( jrnlOpen==0 ||
2fbc0 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   ( sqlite3OsDevi
2fbd0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2fbe0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  s(pPager->jfd) &
2fbf0 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41  .    SQLITE_IOCA
2fc00 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
2fc10 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20  EN_OPEN.  ));.. 
2fc20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
2fc30 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2fc40 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2fc50 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
2fc60 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2fc70 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2fc80 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
2fc90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2fca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
2fcb0 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
2fcc0 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20  locked = 0;     
2fcd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fce0 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
2fcf0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2fd00 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
2fd10 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
2fd20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
2fd30 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
2fd40 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
2fd50 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
2fd60 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
2fd70 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
2fd80 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
2fd90 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
2fda0 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
2fdb0 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
2fdc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
2fdd0 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
2fde0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
2fdf0 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
2fe00 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
2fe10 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2fe20 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
2fe30 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
2fe40 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
2fe50 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
2fe60 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2fe70 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
2fe80 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
2fe90 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
2fea0 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
2feb0 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
2fec0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
2fed0 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
2fee0 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
2fef0 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
2ff00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2ff10 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
2ff20 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
2ff30 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
2ff40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2ff50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
2ff60 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ked ){.      Pgn
2ff70 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
2ff80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ff90 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2ffa0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2ffb0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2ffc0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2ffd0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2ffe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
30000 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
30010 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20  e is zero pages 
30020 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65  in size, that me
30030 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
30040 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20  (1) the.        
30050 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20  ** journal is a 
30060 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70  remnant from a p
30070 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69  rior database wi
30080 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
30090 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a   where.        *
300a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
300b0 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20  ile but not the 
300c0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65  journal was dele
300d0 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20  ted, or (2) the 
300e0 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20  initial.        
300f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
30100 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20  hat populates a 
30110 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
30120 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
30130 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  k..        ** In
30140 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
30150 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
30160 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  an be deleted.  
30170 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61  However, take ca
30180 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  re.        ** no
30190 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
301a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
301b0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
301c0 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20  en due to.      
301d0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64    ** journal_mod
301e0 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20  e=PERSIST..     
301f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
30200 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a  ( nPage==0 && !j
30210 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
30220 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
30230 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
30240 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
30250 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
30260 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
30270 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
30280 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30290 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
302a0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
302b0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
302c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
302d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
302e0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
302f0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
30300 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
30310 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30320 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
30330 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
30340 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
30350 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
30360 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
30370 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
30380 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
30390 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
303a0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
303b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
303c0 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
303d0 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
303e0 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
303f0 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
30400 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
30410 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
30420 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
30430 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
30440 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
30450 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
30460 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
30470 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
30480 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
30490 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
304a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
304b0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
304c0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
304d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
304e0 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
304f0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
30500 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30510 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
30520 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
30530 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
30540 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
30550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
30560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30580 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
30590 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
305a0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
305b0 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
305c0 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
305d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
305e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
305f0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
30610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30630 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
30640 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
30660 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
30670 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
30680 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
30690 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
306a0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
306b0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
306c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
306d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
306e0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
306f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
30700 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
30710 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
30720 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
30730 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
30740 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
30750 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
30760 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
30770 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
30780 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
30790 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
307a0 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
307b0 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
307c0 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
307d0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
307e0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
307f0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
30800 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
30810 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
30820 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
30830 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
30840 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
30850 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
30860 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
30870 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
30880 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
30890 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
308a0 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
308b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
308c0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
308d0 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
308e0 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
308f0 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
30900 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
30910 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30920 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
30930 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
30940 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30960 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30970 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
30980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
30990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
309a0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
309b0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
309c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
309d0 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ile..** It is il
309e0 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71  legal to call sq
309f0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
30a00 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20  e() until after 
30a10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
30a20 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
30a30 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49  sfully called. I
30a40 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  f a shared-lock 
30a50 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
30a60 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
30a70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
30a80 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
30a90 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
30aa0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ing operations a
30ab0 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65  re also performe
30ac0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
30ad0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  on..**.**   1) I
30ae0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
30af0 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
30b00 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f  R_OPEN state (no
30b10 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
30b20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
30b30 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
30b40 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
30b50 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
30b60 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
30b70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
30b80 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
30b90 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
30ba0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
30bb0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
30bc0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
30bd0 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
30be0 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
30bf0 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
30c00 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
30c10 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
30c20 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
30c30 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
30c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30c50 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
30c60 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
30c70 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
30c80 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
30c90 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
30ca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
30cb0 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
30cc0 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
30cd0 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
30ce0 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
30cf0 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
30d00 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
30d10 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
30d20 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
30d30 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
30d40 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
30d50 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
30d60 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
30d70 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
30d80 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
30d90 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
30da0 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
30db0 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
30dc0 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
30dd0 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
30de0 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
30df0 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
30e00 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
30e10 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
30e20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
30e30 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
30e40 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
30e50 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
30e60 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
30e70 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
30e80 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
30e90 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
30ea0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
30eb0 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67  e or .** rolling
30ec0 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
30ed0 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72  file, the IO err
30ee0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
30ef0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
30f00 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
30f10 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
30f20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
30f30 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30f40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30f50 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
30f60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
30f70 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
30f80 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79   b-tree and only
30f90 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
30fa0 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64  no.  ** outstand
30fb0 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
30fc0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
30fd0 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68 6f   pager state sho
30fe0 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20  uld either.  ** 
30ff0 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45  be OPEN or READE
31000 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c  R. READER is onl
31010 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68  y possible if th
31020 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77 61  e pager is or wa
31030 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75  s in .  ** exclu
31040 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
31050 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
31060 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
31070 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
31080 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
31090 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
310a0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
310b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
310c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
310d0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
310e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
310f0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
31100 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20  if( NEVER(MEMDB 
31110 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
31120 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50  de) ){ return pP
31130 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d  ager->errCode; }
31140 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
31150 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
31160 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
31170 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
31180 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61    int bHotJourna
31190 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
311a0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
311b0 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f   exists a hot jo
311c0 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20  urnal-file */.. 
311d0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
311e0 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  B );..    rc = p
311f0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
31200 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
31210 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
31220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31240 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
31250 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
31260 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
31270 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f  LOCK );.      go
31280 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
31290 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
312a0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
312b0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
312c0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
312d0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
312e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
312f0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
31300 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
31310 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
31320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31330 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
31340 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
31350 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
31360 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
31370 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
31380 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
31390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
313a0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
313b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
313c0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
313d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72     if( pPager->r
313e0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
313f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
31400 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
31410 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
31420 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
31430 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
31440 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
31450 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
31460 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
31470 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
31480 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
31490 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
314a0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
314b0 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
314c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
314d0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
314e0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
314f0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
31500 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
31510 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
31520 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
31530 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
31540 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
31550 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
31560 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
31570 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
31580 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
31590 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
315a0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
315b0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
315c0 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
315d0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
315e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
315f0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
31600 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
31610 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
31620 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
31630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31640 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
31650 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
31660 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
31670 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
31680 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
31690 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
316a0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
316b0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
316c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
316d0 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
316e0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
316f0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
31700 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20  the lock is.    
31710 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20    ** downgraded 
31720 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62  to SHARED_LOCK b
31730 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
31740 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20  ion returns..   
31750 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31760 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
31770 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
31780 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
31790 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
317a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
317b0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  iled;.      }. .
317c0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
317d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
317e0 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  en and the file 
317f0 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
31800 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  open the .      
31810 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  ** journal for r
31820 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
31830 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69  . Write access i
31840 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
31850 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  se .      ** in 
31860 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
31870 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
31880 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
31890 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20  e kept open .   
318a0 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62     ** and possib
318b0 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
318c0 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
318d0 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d  on. Also, write-
318e0 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  access .      **
318f0 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75   is usually requ
31900 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ired to finalize
31910 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   the journal in 
31920 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72  journal_mode=per
31930 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  sist .      ** m
31940 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f  ode (and also fo
31950 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74  r journal_mode=t
31960 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20  runcate on some 
31970 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20  systems)..      
31980 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
31990 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
319a0 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
319b0 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
319c0 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20   some .      ** 
319d0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
319e0 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
319f0 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
31a00 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
31a10 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
31a20 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
31a30 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
31a40 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
31a50 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
31a60 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
31a70 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
31a80 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
31a90 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
31aa0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
31ab0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
31ac0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
31ad0 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
31ae0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
31af0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
31b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
31b10 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
31b20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
31b30 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69          int bExi
31b40 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
31b50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
31b60 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
31b70 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
31b80 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
31b90 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
31ba0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
31bb0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
31bc0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78  ESS_EXISTS, &bEx
31bd0 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69  ists);.        i
31be0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31bf0 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
31c00 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
31c10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31c20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
31c30 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
31c40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31c50 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
31c60 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
31c70 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
31c80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31c90 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
31ca0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
31cb0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
31cc0 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
31cd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
31ce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
31cf0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
31d00 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
31d10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31d20 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
31d30 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
31d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
31d50 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
31d60 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
31d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
31d80 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
31d90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
31da0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31db0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
31dc0 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
31dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
31de0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
31df0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
31e00 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
31e10 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
31e20 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
31e30 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
31e40 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
31e50 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
31e60 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
31e70 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
31e80 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
31e90 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
31ea0 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
31eb0 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
31ec0 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
31ed0 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
31ee0 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
31ef0 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
31f00 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
31f10 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
31f20 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
31f30 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
31f40 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
31f50 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
31f60 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
31f70 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
31f80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
31f90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31fa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
31fb0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
31fc0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
31fd0 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
31fe0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
31ff0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
32000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32010 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
32020 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
32030 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
32040 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32050 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
32060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
32070 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
32080 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
32090 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
320a0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
320b0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
320c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
320d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
320e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
320f0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
32100 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
32110 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
32120 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
32130 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
32140 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
32150 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
32160 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
32170 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
32180 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
32190 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
321a0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
321b0 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
321c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
321d0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
321e0 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
321f0 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
32200 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
32210 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
32220 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
32230 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
32240 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
32250 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
32260 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
32270 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
32280 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
32290 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
322a0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
322b0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
322c0 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
322d0 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
322e0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
322f0 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
32300 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
32310 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
32320 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
32330 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
32340 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
32350 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
32360 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
32370 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
32380 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
32390 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
323a0 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
323b0 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
323c0 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
323d0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
323e0 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
323f0 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
32400 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
32410 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
32420 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
32430 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
32440 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
32450 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
32460 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
32470 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
32480 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
32490 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
324a0 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
324b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
324c0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
324d0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
324e0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
324f0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
32500 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32510 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
32520 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
32530 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
32540 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
32550 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
32560 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
32570 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
32580 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
32590 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
325a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
325b0 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72  mpFile && pPager
325c0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
325d0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
325e0 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
325f0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
32600 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
32610 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
32620 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
32630 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
32640 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
32650 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
32660 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
32670 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
32680 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  e hasHeldSharedL
32690 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74  ock flag prevent
326a0 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  s this from.    
326b0 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f    ** occurring o
326c0 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  n the very first
326d0 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c   access to a fil
326e0 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  e, in order to s
326f0 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ave a.      ** s
32700 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72  ingle unnecessar
32710 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  y sqlite3OsRead(
32720 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74  ) call at the st
32730 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a  art-up..      **
32740 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
32750 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64  se changes are d
32760 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
32770 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
32780 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
32790 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
327a0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
327b0 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
327c0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
327d0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
327e0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
327f0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
32800 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
32810 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
32820 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
32830 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
32840 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
32850 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
32860 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
32870 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
32880 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
32890 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
328a0 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
328b0 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
328c0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
328d0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
328e0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
328f0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
32900 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
32910 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
32920 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
32930 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  */.      Pgno nP
32940 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  age = 0;.      c
32950 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
32960 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
32970 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20  FileVers)];..   
32980 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
32990 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
329a0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
329b0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c  ( rc ) goto fail
329c0 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  ed;..      if( n
329d0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Page>0 ){.      
329e0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
329f0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
32a00 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
32a10 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
32a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
32a30 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
32a40 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
32a50 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32a60 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
32a70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32a80 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
32a90 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
32aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
32ab0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
32ac0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
32ad0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
32ae0 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
32af0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
32b00 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
32b10 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
32b20 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
32b30 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
32b40 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32b50 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
32b60 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
32b70 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ger);..        /
32b80 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61  * Unmap the data
32b90 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73  base file. It is
32ba0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65   possible that e
32bb0 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
32bc0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  s.        ** may
32bd0 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20   have truncated 
32be0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32bf0 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e  e and then exten
32c00 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20  ded it back.    
32c10 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72      ** to its or
32c20 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c  iginal size whil
32c30 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77  e this process w
32c40 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  as not holding a
32c50 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
32c60 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
32c70 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61  here may exist a
32c80 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70   Pager.pMap mapp
32c90 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
32ca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
32cb0 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  e the right size
32cc0 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75   but is not actu
32cd0 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69  ally valid. Avoi
32ce0 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  d this.        *
32cf0 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79  * possibility by
32d00 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64   unmapping the d
32d10 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  b here. */.     
32d20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
32d30 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
32d40 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
32d50 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
32d60 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
32d70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
32d80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
32d90 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
32da0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
32db0 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
32dc0 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
32dd0 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
32de0 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
32df0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
32e00 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
32e10 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
32e20 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
32e30 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ent(pPager);.#if
32e40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32e50 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28  _WAL.    assert(
32e60 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
32e70 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
32e80 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  K );.#endif.  }.
32e90 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
32ea0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
32eb0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32ec0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
32ed0 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
32ee0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
32ef0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
32f00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
32f10 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
32f20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32f30 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50  .    rc = pagerP
32f40 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
32f50 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   &pPager->dbSize
32f60 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
32f70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
32f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
32f90 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
32fa0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
32fb0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
32fc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32fd0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
32fe0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
32ff0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
33000 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
33010 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c    pPager->hasHel
33020 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b  dSharedLock = 1;
33030 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
33040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
33050 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
33060 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
33070 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
33080 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
33090 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
330a0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
330b0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
330c0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
330d0 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
330e0 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
330f0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
33100 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
33110 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
33120 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
33130 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
33140 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
33150 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
33160 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
33170 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
33180 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
33190 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
331a0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
331b0 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33  t==0 && (sqlite3
331c0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
331d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
331e0 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72  =0) ){.    pager
331f0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
33200 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
33210 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
33220 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
33230 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
33240 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
33250 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
33260 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
33270 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
33280 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
33290 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
332a0 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
332b0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
332c0 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
332d0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
332e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
332f0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
33300 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
33310 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
33320 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
33330 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
33340 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
33350 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
33360 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
33370 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
33380 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
33390 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
333a0 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
333b0 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
333c0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
333d0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
333e0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
333f0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
33400 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
33410 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
33420 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
33430 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
33440 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
33450 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
33460 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
33470 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
33480 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
33490 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
334a0 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
334b0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
334c0 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
334d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
334e0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
334f0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
33500 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
33510 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
33520 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
33530 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
33540 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
33550 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
33560 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
33570 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
33580 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
33590 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
335a0 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
335b0 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
335c0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
335d0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
335e0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
335f0 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
33600 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
33610 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
33620 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
33630 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
33640 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
33650 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
33660 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
33670 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
33680 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
33690 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
336a0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
336b0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
336c0 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
336d0 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
336e0 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
336f0 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
33700 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
33710 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
33720 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
33730 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
33740 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
33750 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
33760 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
33770 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
33780 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
33790 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
337a0 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
337b0 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
337c0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
337d0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
337e0 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
337f0 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
33800 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
33810 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
33820 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
33830 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
33840 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
33850 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
33860 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
33870 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
33880 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
33890 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
338a0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
338b0 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
338c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
338d0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
338e0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
338f0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
33900 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
33910 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
33920 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
33930 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
33940 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
33950 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
33960 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
33970 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
33980 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
33990 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
339a0 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
339b0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
339c0 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
339d0 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
339e0 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
339f0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
33a00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
33a10 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
33a20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
33a30 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
33a40 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33a50 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
33a60 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
33a70 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
33a80 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
33a90 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
33aa0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
33ab0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33ac0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
33ad0 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
33ae0 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
33af0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
33b00 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
33b10 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
33b20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
33b30 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
33b40 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
33b50 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
33b60 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
33b70 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
33b80 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
33b90 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
33ba0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
33bb0 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
33bc0 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
33bd0 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
33be0 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
33bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
33c00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33c10 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
33c20 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
33c30 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
33c40 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
33c50 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
33c60 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
33c70 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
33c80 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
33c90 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
33ca0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
33cb0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
33cc0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
33cd0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
33ce0 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
33cf0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
33d00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33d10 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
33d20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
33d30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33d40 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
33d50 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
33d60 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ile */.  const i
33d70 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
33d80 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
33d90 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  T_NOCONTENT);.. 
33da0 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
33db0 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
33dc0 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
33dd0 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
33de0 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
33df0 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
33e00 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33e10 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
33e20 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
33e30 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
33e40 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
33e50 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
33e60 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
33e70 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
33e80 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
33e90 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
33ea0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
33eb0 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31  MmapOk = (pgno>1
33ec0 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61   && USEFETCH(pPa
33ed0 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67  ger).   && (pPag
33ee0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33ef0 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
33f00 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52  gs & PAGER_GET_R
33f10 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66  EADONLY)).#ifdef
33f20 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
33f30 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e  C.   && pPager->
33f40 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66  xCodec==0.#endif
33f50 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 74 69  .  );..  /* Opti
33f60 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  mization note:  
33f70 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f  Adding the "pgno
33f80 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65  <=1" term before
33f90 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a   "pgno==0" here.
33fa0 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20    ** allows the 
33fb0 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
33fc0 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  er to reuse the 
33fd0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22  results of the "
33fe0 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73  pgno>1".  ** tes
33ff0 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
34000 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  s statement, and
34010 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70   avoid testing p
34020 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20  gno==0 in the.  
34030 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  ** common case w
34040 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  here pgno is lar
34050 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ge. */.  if( pgn
34060 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20  o<=1 && pgno==0 
34070 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
34080 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34090 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
340a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
340b0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
340c0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
340d0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
340e0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
340f0 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
34100 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b  || bMmapOk==0 );
34110 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
34120 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
34130 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 23 69 66  dLock==1 );..#if
34140 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34150 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f 2a  _CONCURRENT.  /*
34160 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 43   If this is an C
34170 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
34180 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 70 61  ction and the pa
34190 67 65 20 62 65 69 6e 67 20 72 65 61 64 20 77 61  ge being read wa
341a0 73 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69  s.  ** present i
341b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
341c0 69 6c 65 20 77 68 65 6e 20 74 68 65 20 74 72 61  ile when the tra
341d0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
341e0 6e 65 64 2c 0a 20 20 2a 2a 20 6d 61 72 6b 20 69  ned,.  ** mark i
341f0 74 20 61 73 20 72 65 61 64 20 69 6e 20 74 68 65  t as read in the
34200 20 70 41 6c 6c 52 65 61 64 20 76 65 63 74 6f 72   pAllRead vector
34210 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
34220 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 26 26 20  er->pAllRead && 
34230 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
34240 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
34250 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
34260 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41  ecSet(pPager->pA
34270 6c 6c 52 65 61 64 2c 20 70 67 6e 6f 29 3b 0a 20  llRead, pgno);. 
34280 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34290 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
342a0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
342b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
342c0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
342d0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
342e0 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  te, return an er
342f0 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ror immediately.
34300 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
34310 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61  , request the pa
34320 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63  ge from the PCac
34330 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69  he layer. */.  i
34340 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
34350 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de!=SQLITE_OK ){
34360 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
34370 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
34380 73 65 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d 61  se{.    if( bMma
34390 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57  pOk && pagerUseW
343a0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
343b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
343c0 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
343d0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
343e0 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
343f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34400 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
34410 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34420 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61   }..    if( bMma
34430 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30  pOk && iFrame==0
34440 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
34450 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20  pData = 0;..    
34460 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
34470 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
34480 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 69 36  , .          (i6
34490 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
344a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
344b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
344c0 20 26 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b   &pData.      );
344d0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
344e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
344f0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ta ){.        if
34500 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
34510 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b  >PAGER_READER ){
34520 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 20 3d  .          pPg =
34530 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
34540 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
34550 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34560 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
34570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
34580 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  = pagerAcquireMa
34590 70 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67  pPage(pPager, pg
345a0 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29  no, pData, &pPg)
345b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
345c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
345d0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
345e0 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
345f0 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61  no-1)*pPager->pa
34600 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
34610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34620 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
34630 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
34640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
34650 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67            *ppPag
34660 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20  e = pPg;.       
34670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34680 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
34690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
346a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
346b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
346c0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
346d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
346e0 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c  .    {.      sql
346f0 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
34700 20 2a 70 42 61 73 65 3b 0a 20 20 20 20 20 20 70   *pBase;.      p
34710 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Base = sqlite3Pc
34720 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
34730 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34740 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   3);.      if( p
34750 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Base==0 ){.     
34760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34770 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73 73  cacheFetchStress
34780 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34790 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b  , pgno, &pBase);
347a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
347b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
347c0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
347d0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  err;.        if(
347e0 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20   pBase==0 ){.   
347f0 20 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70         pPg = *pp
34800 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
34810 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34820 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
34830 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34840 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  ire_err;.       
34850 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
34860 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
34870 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34880 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
34890 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
348a0 20 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61   pBase);.      a
348b0 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
348c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
348d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
348e0 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
348f0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
34900 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
34910 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
34920 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
34930 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
34940 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
34950 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
34960 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
34970 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
34980 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
34990 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
349a0 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
349b0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
349c0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
349d0 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
349e0 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70  assert( pPg==(*p
349f0 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  pPage) );.  asse
34a00 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70  rt( pPg->pgno==p
34a10 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
34a20 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
34a30 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ager || pPg->pPa
34a40 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
34a50 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20   pPg->pPager && 
34a60 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
34a70 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
34a80 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
34a90 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
34aa0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
34ab0 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
34ac0 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
34ad0 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
34ae0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
34af0 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
34b00 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
34b10 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34b20 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
34b30 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
34b40 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20  _STAT_HIT]++;.  
34b50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34b60 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
34b70 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
34b80 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
34b90 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
34ba0 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
34bb0 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
34bc0 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
34bd0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
34be0 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a   pPager;..    /*
34bf0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
34c00 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
34c10 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
34c20 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
34c30 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
34c40 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
34c50 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64  s, or the unused
34c60 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69   locking-page, i
34c70 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a  s requested. */.
34c80 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
34c90 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
34ca0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
34cb0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
34cc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34cd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34ce0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34cf0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34d00 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
34d10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
34d20 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  ze<pgno || noCon
34d30 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28  tent || !isOpen(
34d40 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
34d50 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
34d60 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
34d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
34d80 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
34d90 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34da0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34db0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
34dc0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
34dd0 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
34de0 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
34df0 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
34e00 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
34e10 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
34e20 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
34e30 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
34e40 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
34e50 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
34e60 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
34e70 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
34e80 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
34e90 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
34ea0 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
34eb0 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
34ec0 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
34ed0 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
34ee0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
34ef0 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
34f00 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
34f10 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
34f20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
34f30 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
34f40 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
34f50 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
34f60 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
34f70 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
34f80 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
34f90 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
34fa0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
34fb0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
34fc0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
34fd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34ff0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
35000 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
35010 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
35020 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
35030 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
35040 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
35050 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
35060 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
35070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
35080 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
35090 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
350a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
350b0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
350c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
350d0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
350e0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
350f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
35100 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20   bMmapOk==0 ){. 
35110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35120 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
35130 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
35140 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
35150 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
35160 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
35170 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35190 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
351a0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
351b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
351c0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
351d0 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
351e0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
351f0 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
35200 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35210 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
35220 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
35230 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
35240 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
35250 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
35260 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
35270 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
35280 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
35290 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
352a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
352b0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
352c0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
352d0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
352e0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
352f0 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
35300 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
35310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
35320 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
35330 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
35340 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
35350 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
35360 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
35370 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
35380 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
35390 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
353a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
353b0 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
353c0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
353d0 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
353e0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
353f0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
35400 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
35410 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
35420 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
35430 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
35440 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
35450 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
35460 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
35470 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
35480 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
35490 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
354a0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
354b0 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
354c0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
354d0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
354e0 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
354f0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
35500 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
35510 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73   Pgno pgno){.  s
35520 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
35530 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
35540 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
35550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
35560 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
35570 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
35580 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
35590 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
355a0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
355b0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20  che, pgno, 0);. 
355c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d   assert( pPage==
355d0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73  0 || pPager->has
355e0 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29  HeldSharedLock )
355f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  ;.  if( pPage==0
35600 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
35610 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
35620 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70  cheFetchFinish(p
35630 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35640 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a  pgno, pPage);.}.
35650 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
35660 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
35670 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
35680 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
35690 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
356a0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
356b0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
356c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
356d0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
356e0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
356f0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
35700 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
35710 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
35720 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
35730 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
35740 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
35750 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35760 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65  efNotNull(DbPage
35770 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
35780 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  *pPager;.  asser
35790 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70  t( pPg!=0 );.  p
357a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
357b0 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
357c0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
357d0 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52  AP ){.    pagerR
357e0 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50  eleaseMapPage(pP
357f0 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
35800 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
35810 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
35820 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
35830 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
35840 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
35850 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
35860 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
35870 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
35880 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
35890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
358a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
358b0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
358c0 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
358d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
358e0 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
358f0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
35900 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
35910 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35920 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
35930 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35940 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
35950 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35960 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
35970 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
35980 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
35990 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
359a0 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
359b0 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
359c0 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
359d0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
359e0 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
359f0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
35a00 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
35a10 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
35a20 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
35a30 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
35a40 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
35a50 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
35a60 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
35a70 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
35a80 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
35a90 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
35aa0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
35ab0 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
35ac0 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
35ad0 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
35ae0 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
35af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
35b00 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
35b10 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
35b20 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
35b30 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
35b40 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
35b50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
35b60 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
35b70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
35b80 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
35b90 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
35ba0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
35bb0 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
35bc0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
35bd0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
35be0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
35bf0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
35c00 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
35c10 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
35c20 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
35c30 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
35c40 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
35c50 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
35c60 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
35c70 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
35c80 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
35c90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
35ca0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
35cb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
35cc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35cd0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
35ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
35cf0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
35d00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
35d10 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
35d20 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
35d30 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
35d40 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
35d50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
35d60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35d70 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
35d80 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
35d90 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
35da0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
35db0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35dc0 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
35dd0 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
35de0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
35df0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
35e00 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
35e10 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
35e20 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
35e30 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
35e40 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
35e50 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
35e60 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
35e70 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
35e80 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
35e90 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
35ea0 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
35eb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
35ec0 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
35ed0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
35ee0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
35ef0 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
35f00 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
35f10 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
35f20 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
35f30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
35f40 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
35f50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35f60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
35f70 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
35f80 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
35f90 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
35fa0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
35fb0 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
35fc0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
35fd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
35fe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
35ff0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
36000 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
36010 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
36020 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
36030 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
36040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
36050 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
36060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36070 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
36080 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
36090 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
360a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
360b0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
360c0 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
360d0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
360e0 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
360f0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
36100 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
36110 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
36120 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
36130 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
36140 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
36150 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  AL).          );
36160 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  ..        /* Ver
36170 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
36180 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20  abase still has 
36190 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
361a0 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20   it did when.   
361b0 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f       ** it was o
361c0 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
361d0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
361e0 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  = databaseIsUnmo
361f0 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ved(pPager);.   
36200 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36210 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66  ITE_OK ){.#ifdef
36220 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
36230 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
36240 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36250 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
36260 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
36270 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
36280 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
36290 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
362a0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
362b0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c            );.#el
362c0 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
362d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
362e0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
362f0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
36300 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
36310 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
36320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
36330 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
36340 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
36350 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
36360 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
36370 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
36380 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
36390 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
363a0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
363b0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
363c0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
363d0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
363e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
363f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
36400 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
36410 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
36420 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
36430 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
36440 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
36450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
36460 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
36470 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
36480 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
36490 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
364a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
364b0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
364c0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
364d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
364e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
364f0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
36500 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
36510 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
36520 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
36530 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
36540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36550 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36560 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
36570 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
36580 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
36590 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
365a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
365b0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
365c0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
365d0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
365e0 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
365f0 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
36600 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
36610 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
36620 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
36630 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
36640 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
36650 61 72 67 75 6d 65 6e 74 20 69 73 20 30 2c 20 74  argument is 0, t
36660 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
36670 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
36680 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
36690 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
366a0 20 65 78 46 6c 61 67 20 69 73 20 3e 30 2c 20 74   exFlag is >0, t
366b0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
366c0 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
366d0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
366e0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
366f0 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
36700 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
36710 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
36720 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 28 65 78  ed..**.** If (ex
36730 46 6c 61 67 3c 30 29 20 61 6e 64 20 74 68 65 20  Flag<0) and the 
36740 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 57  database is in W
36750 41 4c 20 6d 6f 64 65 2c 20 64 6f 20 6e 6f 74 20  AL mode, do not 
36760 74 61 6b 65 20 61 6e 79 20 6c 6f 63 6b 73 2e 0a  take any locks..
36770 2a 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  ** The transacti
36780 6f 6e 20 77 69 6c 6c 20 72 75 6e 20 69 6e 20 43  on will run in C
36790 4f 4e 43 55 52 52 45 4e 54 20 6d 6f 64 65 20 69  ONCURRENT mode i
367a0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
367b0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
367c0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
367d0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
367e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
367f0 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
36800 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
36810 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
36820 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
36830 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
36840 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
36850 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
36860 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
36870 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
36880 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
36890 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
368a0 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
368b0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
368c0 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
368d0 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
368e0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
368f0 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
36900 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
36910 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
36920 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
36930 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
36940 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
36950 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
36960 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
36970 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
36980 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
36990 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
369a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
369b0 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
369c0 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
369d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
369e0 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
369f0 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
36a00 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
36a10 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
36a20 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
36a30 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
36a40 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
36a50 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
36a60 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
36a70 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
36a80 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
36a90 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
36aa0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
36ab0 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
36ac0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
36ad0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
36ae0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
36af0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
36b00 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
36b10 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
36b20 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
36b30 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
36b40 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
36b50 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
36b60 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
36b70 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
36b80 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
36b90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
36ba0 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
36bb0 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
36bc0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
36bd0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
36be0 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
36bf0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
36c00 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
36c10 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
36c20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
36c60 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
36c70 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
36c80 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
36c90 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
36ca0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
36cb0 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
36cc0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
36cd0 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
36ce0 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
36cf0 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
36d00 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
36d10 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
36d20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
36d30 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
36d40 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
36d50 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
36d60 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
36d70 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
36d80 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
36d90 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
36da0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
36db0 63 61 6c 6c 20 69 74 2e 20 20 2a 2f 0a 20 20 20  call it.  */.   
36dc0 20 20 20 69 66 28 20 65 78 46 6c 61 67 3e 3d 30     if( exFlag>=0
36dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36de0 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
36df0 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
36e00 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
36e10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
36e20 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
36e30 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
36e40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36e50 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
36e60 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
36e70 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
36e80 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
36e90 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
36ea0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
36eb0 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
36ec0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
36ed0 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
36ee0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
36ef0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
36f00 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
36f10 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
36f20 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
36f30 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
36f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
36f50 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
36f60 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
36f70 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
36f80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
36f90 26 20 65 78 46 6c 61 67 3e 30 20 29 7b 0a 20 20  & exFlag>0 ){.  
36fa0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36fb0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
36fc0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
36fd0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
36fe0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
36ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37000 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
37010 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
37020 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
37030 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
37040 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
37050 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
37060 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
37070 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
37080 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
37090 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
370a0 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
370b0 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
370c0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
370d0 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
370e0 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
370f0 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
37100 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
37110 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
37120 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
37130 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
37140 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
37150 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
37160 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
37170 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
37180 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
37190 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
371a0 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
371b0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
371c0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
371d0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
371e0 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
371f0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
37200 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
37210 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
37220 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
37230 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
37240 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
37250 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
37260 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
37270 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37280 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
37290 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
372a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
372b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
372c0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
372d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
372e0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
372f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37300 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
37310 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
37320 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
37330 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
37340 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
37350 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
37360 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
37370 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
37380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
37390 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74   page pPg onto t
373a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f  he end of the ro
373b0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
373c0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
373d0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61  _NOINLINE int pa
373e0 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
373f0 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64  backJournal(PgHd
37400 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
37410 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
37420 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
37430 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
37440 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
37450 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
37460 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
37470 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20  .  /* We should 
37480 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
37490 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
374a0 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
374b0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
374c0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
374d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
374e0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
374f0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
37500 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ot. */.  assert(
37510 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
37520 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
37530 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
37540 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
37550 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
37560 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45  nalOff );.  CODE
37570 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C2(pPager, pPg->
37580 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
37590 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
375a0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
375b0 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61 67  );.  cksum = pag
375c0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
375d0 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
375e0 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
375f0 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
37600 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
37610 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
37620 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  e.  ** page in t
37630 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
37640 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
37650 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
37660 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  age..  ** Otherw
37670 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
37680 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
37690 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
376a0 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79  gic in.  ** play
376b0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
376c0 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
376d0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
376e0 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
376f0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
37700 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
37710 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
37720 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
37730 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72  o,.  ** then cor
37740 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
37750 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  ow..  */.  pPg->
37760 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
37770 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20  EED_SYNC;..  rc 
37780 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
37790 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
377a0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69   pPg->pgno);.  i
377b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
377c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
377d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
377e0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
377f0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
37800 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
37810 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
37820 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37830 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72 69 74   rc;.  rc = writ
37840 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
37850 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
37860 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
37870 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
37880 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37890 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43  rn rc;..  IOTRAC
378a0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
378b0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
378c0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
378d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
378e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
378f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
37900 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
37910 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
37920 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  tej_count);.  PA
37930 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
37940 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
37950 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
37960 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
37970 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
37980 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
37990 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
379a0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
379b0 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
379c0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
379d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
379e0 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
379f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
37a00 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
37a10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37a20 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
37a30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
37a40 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
37a50 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
37a60 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73  Pg->pgno);.  tes
37a70 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
37a80 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73  E_NOMEM );.  ass
37a90 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
37aa0 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
37ab0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c  _NOMEM );.  rc |
37ac0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
37ad0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
37ae0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73  pPg->pgno);.  as
37af0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37b00 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
37b10 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74  E_NOMEM );.  ret
37b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37b30 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
37b40 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
37b50 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
37b60 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
37b70 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
37b80 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
37b90 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
37ba0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
37bb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
37bc0 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
37bd0 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
37be0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
37bf0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
37c00 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
37c10 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
37c20 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
37c30 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
37c40 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
37c50 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
37c60 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
37c70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
37c80 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
37c90 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
37ca0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
37cb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37cc0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
37cd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
37ce0 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
37cf0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37d00 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
37d10 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
37d20 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
37d30 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
37d40 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
37d50 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
37d60 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
37d70 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
37d80 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
37d90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37da0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37db0 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
37dc0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37dd0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37de0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
37df0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37e00 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37e10 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
37e20 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
37e30 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37e40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37e50 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20  ger->errCode==0 
37e60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37e70 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ger->readOnly==0
37e80 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41 47 45   );.  CHECK_PAGE
37e90 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
37ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
37eb0 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
37ec0 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
37ed0 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
37ee0 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
37ef0 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
37f00 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
37f10 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
37f20 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
37f30 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
37f40 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
37f50 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
37f60 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
37f70 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
37f80 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
37f90 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
37fa0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
37fb0 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
37fc0 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
37fd0 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
37fe0 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
37ff0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
38000 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
38010 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
38020 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
38030 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
38040 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
38050 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
38060 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
38070 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
38080 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
38090 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
380a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
380b0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
380c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
380d0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
380e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
380f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
38100 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
38110 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
38120 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
38130 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
38140 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
38150 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
38160 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
38170 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 74 68  Mark the page th
38180 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  at is about to b
38190 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 64 69  e modified as di
381a0 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rty. */.  sqlite
381b0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
381c0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
381d0 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
381e0 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20 74 68  al is in use, th
381f0 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  em make sure the
38200 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61 62   page that is ab
38210 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e  out.  ** to chan
38220 67 65 20 69 73 20 69 6e 20 74 68 65 20 72 6f 6c  ge is in the rol
38230 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f  lback journal, o
38240 72 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  r if the page is
38250 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66 66 0a   a new page off.
38260 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20 6f 66    ** then end of
38270 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b 65 20   the file, make 
38280 73 75 72 65 20 69 74 20 69 73 20 6d 61 72 6b 65  sure it is marke
38290 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f  d as PGHDR_NEED_
382a0 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  SYNC..  */.  ass
382b0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 70 49  ert( (pPager->pI
382c0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d 3d 20  nJournal!=0) == 
382d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
382e0 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
382f0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
38300 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  =0.   && sqlite3
38310 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
38320 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  l(pPager->pInJou
38330 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
38340 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  ==0.  ){.    ass
38350 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
38360 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
38370 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
38380 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
38390 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
383a0 20 3d 20 70 61 67 65 72 41 64 64 50 61 67 65 54   = pagerAddPageT
383b0 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c  oRollbackJournal
383c0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
383d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
383e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
383f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
38400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
38410 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
38420 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
38430 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
38440 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
38450 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
38460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47       }.      PAG
38470 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
38480 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
38490 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
384a0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
384b0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
384c0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
384d0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
384e0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
384f0 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d 0a 20  ?1:0)));.    }. 
38500 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 47 48   }..  /* The PGH
38510 44 52 5f 44 49 52 54 59 20 62 69 74 20 69 73 20  DR_DIRTY bit is 
38520 73 65 74 20 61 62 6f 76 65 20 77 68 65 6e 20 74  set above when t
38530 68 65 20 70 61 67 65 20 77 61 73 20 61 64 64 65  he page was adde
38540 64 20 74 6f 20 74 68 65 20 64 69 72 74 79 2d 6c  d to the dirty-l
38550 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20 62 65 66  ist.  ** and bef
38560 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 65 20  ore writing the 
38570 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 72 6f  page into the ro
38580 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
38590 20 57 61 69 74 20 75 6e 74 69 6c 20 6e 6f 77 2c   Wait until now,
385a0 0a 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20  .  ** after the 
385b0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 73 75  page has been su
385c0 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f 75 72 6e  ccessfully journ
385d0 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65 20 73 65  alled, before se
385e0 74 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 50  tting the.  ** P
385f0 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 20 62  GHDR_WRITEABLE b
38600 69 74 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  it that indicate
38610 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
38620 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 6d 6f  can be safely mo
38630 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  dified..  */.  p
38640 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
38650 44 52 5f 57 52 49 54 45 41 42 4c 45 3b 0a 20 20  DR_WRITEABLE;.  
38660 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
38670 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
38680 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
38690 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
386a0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74  ,.  ** then writ
386b0 65 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  e the